3.1 目标文件的格式
- PC 平台流行的可执行文件的格式主要是 windows 下面的 PE 和 Linux 下的ELF, 他们都是COFF 格式的变种
3.2 目标文件是什么样的
一般来说, text 段放置代码, data段放置初始化的数据(全局变量或者静态变量), bss 放置未初始化的数据(全局变量或者静态变量)
bss 段只是为未初始化的全局变量和静态变量预留了位置, 并没有内容, 不会占有空间
将程序指令和数据分离的好处
- 方便权限控制
- 代码段只读, 数据段可读可写
- 提高程序的局部性,提高缓存的命中率
- 当系统中运行多个程序的副本的时候, 可以共用一份代码数据页面
- 方便权限控制
3.3 挖掘SimpleSection.o
- 代码段
- 实际上就是text 段中的字节码
- 数据段和只读数据段
- BSS段(未初始化的全局变量或者局部静态变量)
- 其他
3.4 ELF 文件结构描述
3.4.1. 文件头
2. 文件头中定义了ELF魔数,文件机器字节长度,数据存储方式,版本,运行平台, ABI版本, ELF重定位类型,硬件平台版本,入口地址,程序头入口和长度,段表位置长度,段的数量等信息
3. ELF 魔数, 一般是用来确认文件的类型的
3. 简单来说, 就是定义了一堆程序运行的说明信息
3.4.2 段表
- 通过ELF 文件头中的e_short 字段指定段表位置,定义了段的基本信息
- 段的名字只在链接和编译的过程中有意义,但不能真正表示段的类型
3.4.3 重定位表
- 连接器在处理目标文件的时候,需要对目标文件中的某些部位进行重定位, ie, 代码段和数据段中那些对绝对地址的引用的位置。这时候需要有一个重定位表
3.4.4 字符串表
3.5 链接的接口–符号
- 符号可以看成是链接中的粘合剂
符号修饰和符号签名
extern “C”
#ifdef __cplusplus extern "C" { #endif void * memset(void *, int, size_t) #ifdef __cplusplus } #endif
- 强弱符号