• Linux内核分析第七周———可执行程序的装载


    Linux内核分析第七周———可执行程序的装载

    李雪琦+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    一、知识要点:

    Linux中,可以从c源代码生产一个可执行程序,这其中要经过预处理、编译和链接的过程。可以参考以下图来理解这个过程:

    其中,目标文件中至少有编译后的机器指令代码、数据,也还包括了链接时所须要的一些信息,比如符号表、调试信息、字符串等。这Linux中,可执行文件的格式现在主要是ELF格式(对应于Windows中PE格式)。ELF的格式如下:

    链接,是收集、组织程序所需的不同代码和数据的过程,以便程序能被装入内存并被执行。

    链接过程分为两步:

    • 1.空间与地址分配
    • 2.符号解析与重定位

    在Linux中,一个程序的执行是做为一个新的进程,使用execve系统调用完成的。execve对应的系统调用是sys_execve,在其内部会解析可执行文件格式。对应的内核代码,就是,在search_binary_handler中寻找符合文件格式对应的解析模块,关键代码如下:

    对于ELF文件,retval = fmt->load_binary(bprm)实际上执行的就是load_elf_binary,其内部就是按照ELF文件格式来加载ELF文件的。这里,我们也可以看到Linux是可以支持多种可执行文件格式的,所有的格式处里信息用一个结构体存储在一个链表中,其中的load_binary是一个函数指针,对应于该中格式的可执行文件的加载方式;要想支持一种新的可执行文件,只需要向链表中注册一个新的format结构体就可以了,此种设计类似观察者模式,具有很好的扩展性。

    二、实验过程:

    打开实验楼中的虚拟机,在shell中依次运行以下命令,获取本次实验的代码,并编译运行

    cd LinuxKernel
    
    rm menu -rf
    
    git clone https://github.com/mengning/menu.git
    
    cd menu
    
    mv test_exec.c test.c
    
    make rootfs 
    

    效果如下:

    关闭QEMU窗口,在shell窗口中,cd LinuxKernel回退到LinuxKernel目录,使用下面的命令启动内核并在CPU运行代码前停下以便调试:

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 
    

    接下来,我们就可以水平分割一个新的shell窗口出来,依次使用下面的命令启动gdb调试

    gdb
    
    (gdb) file linux-3.18.6/vmlinux
    
    (gdb) target remote:1234
    

    并在系统调用sys_execve的入口处设置断点

    (gdb) b sys_execve
    

    继续运行程序,在QEMU窗口中输入exec,系统就会停在上面设置的断点处,如图:

    接下来我们可以单步跟踪sys_execve的内核代码,也可以通过设置以下断点

    b load_elf_binary
    
    b start_thread
    

    来完整地跟踪进程的创建和启动代码。

    三、总结:

    Linux系统可以通过execve API启动一个新进程,该API又呼叫sys_execve系统调用,负责将新的程序代码和数据替换到新的进程中,打开可执行 文件,载入依赖的库文件,申请新的内存空间,最后执行 start_thread(regs, elf_entry, bprm->p) ,设置 new_ip, new_sp ,完成新进程的代码和数据替换,然后返回,接下来就是执行新的进程代码了。

  • 相关阅读:
    如何在Centos官网下载所需版本的Centos
    Zabbix微信告警
    CentOS 7.4 源码编译安装 Redis
    zabbix源码安装后,设置为服务启动和关闭
    MySQL 快速入门教程
    mysql解决 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)的报错
    转:Centos7安装zabbix3.4超详细步骤解析
    centos7使用Gogs搭建Git服务器
    Centos7 使用firewall管理防火墙
    zabbix登录密码重置方法
  • 原文地址:https://www.cnblogs.com/lxq20135309/p/5373427.html
Copyright © 2020-2023  润新知