zoukankan      html  css  js  c++  java
  • 《Linux内核分析》第七周: 可执行程序的装载

    LINUX内核分析第七周学习总结——可执行程序的装载

    杨舒雯(原创作品转载请注明出处)

    《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    学习笔记

    一、预处理、编译、链接和目标文件的格式

    1.可执行程序是怎么得来的

    C代码——预处理——汇编代码——目标代码——可执行文件
    2.目标文件的格式ELF

    (1)A.out COFF PE、ELF(Linux中)

    (2)ABI——应用程序二进制接口

    (3)种类:

    一个可重定位(relocatable)文件保存着代码和适当的数据,用来和其他的object文件一起来创建一个可执行文件或者是一个共享文件。
    一个可执行(executable)文件保存着一个用来执行的程序;该文件指出了exec(BA_OS)如何来创建程序进程映象。
    一个共享object文件保存着代码和合适的数据,用来被下面的两个链接器链接。第一个是连接编辑器[请参看ld(SD_CMD)],可以和其他的可重定位和共享object文件来创建其他的object。第二个是动态链接器,联合一个可执行文件和其他的共享object文件来创建一个进程映象。
    3.静态链接的ELF可执行文件和进程的地址空间

    程序从0x804800开始。

    可执行文件加载到内存中开始执行的第一行代码。

    一般静态链接将会把所有代码放在同一个代码段。

    动态连接的进程会有多个代码段。

    实验部分: 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve

    实验步骤:

    1.配置环境,登录实验楼网站。

    按照上次实验的基本步骤,结合老师视频所讲,完成相关实验。

    cd LinuxKernel

    删除menu

    然后从github上克隆相应的mengning/menu.git

    环境配置验证

    配置成功。

    2. 编译链接的过程。

    gcc -x cpp-output -S -o hello.s hello.cpp -m32 
    gcc -x assembler -c hello.s -o hello.o -m32 
    gcc -o hello hello.o -m32 
    gcc -o hello.static hello.o -m32 -static
    

    实验结果:

    3.配置调试系统,和gdb调试配置

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S //配置调试环境

    利用file linux-3.18.6/vmlinux和target remote:1234来配置加载初始调试环境.

    4.设置断点sys_execve,load_elf_binary,start_thread

    5.调试与验证所学和理解的sys_execve的知识:

    断点1与展示:

    单步进入调试查看sys_execve:

    断点2,load_elf_binary:

    断点3,start_thread,利用po new_ip 定位执行地址:

    相应的地址验证:

    栈内变量处理:

    实验总结:

    内核中实际执行execv()或execve()系统调用的程序是do_execve(),这个函数先打开目标映像文件,并从目标文件的头部(从第一个字节开始)读入若干(128)字节,然后调用另一个函数search_binary_handler(),在那里面让各种可执行程序的处理程序前来认领和处理。内核所支持的每种可执行程序都有个struct linux_binfmt数据结构,通过向内核登记挂入一个队列。而search_binary_handler(),则扫描这个队列,让各个数据结构所提供的处理程序、即各种映像格式、逐一前来认领。如果某个格式的处理程序发现特征相符而,便执行该格式映像的装入和启动。简而言之,庄周(调用execve的可执行程序)入睡(调用execve陷入内核),醒来(系统调用execve返回用户态)发现自己是蝴蝶(被execve加载的可执行程序)。
  • 相关阅读:
    [转载]Install Opera 12.16 Web Browser in CentOS/RHEL and Fedora
    [转载]CentOS 6.5 安装五笔输入法
    [转载]Lenovo E431 装Centos7无线驱动安装
    ElasticSearch的按日期排序问题
    [转载]java自带线程池和队列详细讲解
    [转载]Redis后台启动
    [转载]Process工具类,提供设置timeout功能
    [转载]使用java.lang.Process类的简单例子
    [转载]SecureCRT 绝佳配色方案, 保护你的眼睛
    4.二叉搜索树转为有序双向链表(递归算法与非递归算法)
  • 原文地址:https://www.cnblogs.com/yswysw/p/5352054.html
Copyright © 2011-2022 走看看