• 2020-2021-1 20209309《Linux内核原理与分析》第八周作业


    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第八周作业>
    这个作业的目标 学习Linux内核如何装载和启动一个可执行程序
    作业正文 本博客链接

    实验内容

    更新对应的menu文件夹

    运行相应的exec命令

    修改相应的makefile文件,准备进行调试

    进行相应的调试

    设置三个断点:

    b sys_exec
    b load_elf_binary
    b start_thread
    


    运行exec进行调试

    退出调试之后,使用readelf命令查看elf文件头

    小结

    ELF文件类型

    可重定位文件、可执行文件、共享目标文件

    • 可重定位文件:一般是中间文件,还需要继续处理。由汇编器和编译器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。
    • 可执行文件:一般由多个可重定位文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
    • 共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。

    ELF文件结构

    在ELF文件中的各个section内都装载了性质和属性相同的内容。

    • .text:已编译程序的机器代码。
    • .rodata:只读数据。
    • .data:已初始化的全局变量。局部变量在运行时被保存在栈中,因此既不出现在.data中,也不出现在.bss节中。
    • .bss:未初始化的全局变量。在目标文件中不占据实际的空间,仅起占位符作用。在目标文件格式中区分初始化和未初始化变量的目的是为了提高空间效率,未初始化变量不需要占据任何实际的磁盘空间。
    • .symtab:符号表,存放在程序中被定义和引用的函数和全局变量的信息。
    • .rel.text:当链接噐把这个目标文件和其他文件结合时,.text节中的许多位置都需要修改。一般而言,任何调用外部函数或者引用全局变量的指令都需要修改。另一方面调用本地函数的指令则不需要修改。可执行目标文件中并不需要重定位信息,因此通常省略,除非使用者显式地指示链接器包含这些信息。
    • .rel.data:被模块定义或引用的任何全局变量的信息。一般而言,任何已初始化全局变量的初始值是全局变量或者外部定义函数的地址都需要被修改。
    • .debug:一个调试符号表,其有些表项是程序中定义的局部变量和类型定义,有些表项是程序中定义和引用的全局变量,有些是原始的源文件。只有以-g选项调用编译驱动程序时,才会得到这张表。
    • .line:原始源程序中的行号和.text节中机器指令之间的映射。只有以-g选项调用编译驱动程序时,才会得到这张表。
    • .strtab:一个字符串表,其内容包括.symtab和.debug节中的符号表,以及节头部中的节名字。字符串表就是以null结尾的字符串序列。

    ELF文件参与程序链接(建立一个程序)和程序的执行(运行一个文件)。

  • 相关阅读:
    Linux内核tracepoints
    Linux 设备驱动的固件加载
    Android HIDL HAL 接口定义语言详解
    Android HIDL 详解
    Android各版本对应的SDK版本
    ifconfig调用过程
    Input系统—启动篇
    Linux下2号进程的kthreadd--Linux进程的管理与调度
    rest_init函数分析(续)
    【python】-常用模块2
  • 原文地址:https://www.cnblogs.com/yanzs/p/14054027.html
Copyright © 2020-2023  润新知