参考书籍:《深入理解计算机系统》
基本概念
加载器
加载器将可执行文件的内容映射要内存中,并运行这个程序。
链接器
链接器可以将各种代码和数据片段收集并组合成为一个单一文件,这个文件可被加载到内存并执行。
符号解析
符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义。
重定位
重定位确定每个符号的最终内存地址,并修改对那些目标的引用。
位置无关代码
可以加载但无需重定位的代码称为位置无关代码。
关键点
编译器驱动程序
如图所示,源文件经过C预处理器(cpp)、C编译器(ccl)和汇编器(as)被翻译成可重定位目标文件(XXX.o),然后链接器(ld)将可重定位目标文件和一些必要的系统目标文件组合起来,创建一个可执行目标文件。
可重定位目标文件
- .text:已编译程序的机器代码;
- .data:已初始化的全局和静态C变量;
- .bss:未初始化的全局和静态C变量;以及所有被初始化为0的全局或静态变量;
- .symtab:一个符号表,它存放在程序中定义和引用的函数和全局变量的信息;
- .rel .text:一个.text节中位置的列表,当链接器把这个目标文件和其他文件组合时,需要修改这些位置。
- .rel .data:被模块引用或定义的所有全局变量的重定位信息。
可执行目标文件
- 段头部表:将连续的文件节映射到运行时内存块;
- 节头部表:描述目标文件的节。
运行时内存映像
当加载器运行时,它创建如图所示的内存映像。