一、实验相关知识
1.1 编译链接的过程
编译链接是将源代码转换为可执行程序的过程,它通常包括以下几个步骤:
预处理(Preprocessing):
预处理是编译链接过程的第一步。在这个阶段,预处理器会对源代码进行处理,包括展开宏定义、插入头文件内容等。预处理器根据以字符 ‘#’ 开头的预处理指令(如#include、#define等)修改源代码,生成一个经过预处理的代码文件。
编译(Compilation):
编译是将预处理后的代码文件转换为汇编代码的过程。编译器会将源代码转换为汇编语言,生成相应的汇编代码文件。在这个过程中,编译器会进行词法分析、语法分析、语义分析等操作,检查代码的正确性,并将其转化为汇编代码。
汇编(Assembly):
汇编是将汇编代码转换为机器代码的过程。汇编器会读取汇编代码文件,将其转换为机器可执行的指令,生成目标文件。每条汇编指令通常对应一条机器指令,包括操作码、寄存器、内存地址等。
链接(Linking):
链接是将多个目标文件和库文件合并成一个可执行程序的过程。在链接过程中,链接器会解析目标文件中的符号引用和定义,处理符号表,将各个目标文件之间的引用关系进行连接。链接器还会处理库文件,将需要的库函数与程序进行关联。最终生成一个完整的可执行程序文件。
1.2 ELF 可执行文件格式
ELF可执行文件格式由以下几个主要组成部分构成:
ELF文件头(ELF Header):
ELF文件头位于文件的开头,包含了描述整个文件的基本信息,如文件类型、目标体系结构、入口点地址、程序头表和节头表的偏移等。文件头提供了读取和解析ELF文件的基本信息。
程序头表(Program Header Table):
程序头表描述了ELF文件在内存中的布局,包括加载和执行所需的段(段是ELF中的逻辑组织单位)信息。每个程序头表项描述了一个段的起始地址、大小、访问权限等信息,用于操作系统加载和执行可执行文件。
节头表(Section Header Table):
节头表包含了关于各个节的信息,如代码段、数据段、符号表等。每个节头表项描述了一个节的起始地址、大小、访问权限、符号表索引等信息。节头表对于调试和链接程序非常重要。
节区(Sections):
节区是ELF文件中的逻辑组织单位,包含各种数据和代码。常见的节区有代码段(.text)、数据段(.data)、只读数据段(.rodata)、符号表(.symtab)等。每个节区可以有不同的属性,如可执行、可写、可读等。
符号表(Symbol Table):
符号表存储了程序中定义和引用的符号信息,如变量、函数、全局变量等。符号表中的每个符号项包含了符号的名称、类型、大小、绑定等信息,用于链接和调试程序。
除了上述主要组成部分,ELF文件还包含其他一些辅助信息,如动态链接信息、重定位表、调试信息等,用于支持动态链接、程序调试和代码重定位等功能。
ELF可执行文件格式的设计使得它具有良好的可扩展性和可移植性,能够适应不同的操作系统和目标体系结构。它被广泛应用于各种编程环境和开发工具中,为程序的开发、编译、链接和执行提供了基础支持。
二、实验
使用gdb跟踪分析execve系统调用内核处理函数sys_execve。
1.用test_exec.c将test.c覆盖,然后重新编译rootfs
2.启动内核,设置断点