4.1 可重定位目标文件格式
- ELF 头
定义了ELF魔数、版本、小端/大端、操作系统平台、目标文件的类型、机器结构类型、节头表的起始位置和长度等
- .text 节
编译后的代码部分
- .rodata 节
只读数据,如 printf 格式串、switch 跳转表等
- .data 节
已初始化的全局变量
- .bss 节
未初始化全局变量,仅是占位符,不占据任何实际磁盘空间。区分初始化和非初始化是为了空间效率
4.2 符号解析与重定位
.symtab 节记录符号表信息,是一个结构数组
4.2.1 符号解析
- 目的:将每个模块中引用的符号与某个目标模块中的定义符号建立关联。
- 符号的定义:指被分配了存储空间。为函数名时,指代码所在区;为变量名时,指所占的静态数据区。
4.2.2 强弱符号
- 函数名和已初始化的全局变量名是强符号
- 未初始化的全局变量名是弱符号
4.2.3 多重定义符号的处理规则
- Rule 1: 强符号不能多次定义
强符号只能被定义一次,否则链接错误 - Rule 2: 若一个符号被定义为一次强符号和多次弱符号,则按强定义为准