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加载的可执行程序)。
  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/yswysw/p/5352054.html
Copyright © 2011-2022 走看看