7.1编译器驱动程序
.c文件通过预处理器(cpp)翻译为ASCII码的中间文件.i,然后通过c编译器(cll)翻译成一个ASCII汇编文件.s,之后驱动程序通过汇编器(as)翻译成一个可重定位目标文件,最后运行链接器程序(ld)将.o以及一些必要的系统目标文件结合起来,创建一个可执行目标文件
7.2静态编译
7.3目标文件
7.4可重定位目标文件
ELF头以一个16字节的序列开始,该序列描述了生成该文件的系统的字的大小和字节顺序。
ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。
7.5符号和符号表
7.6符号解析
7.6.1链接器如何解析多重定义的全局符号
7.6.2与静态库链接
7.6.3链接器如何使用静态库来解析引用
不幸的是,这种算法会导致一些令人困扰的链接时错误,因为命令行上的库和目标文件的顺序非常重要
7.7重定位
7.7.1重定位条目
ELF定义了32种不同的重定位类型,以下是两种最基本的重定位类型
7.7.2重定义符号引用
1.重定位PC相对引用
2.重定位绝对引用
7.8可执行目标文件
第二个段剩下的8个字节对应于运行时将被初始化为0的.bss数据
7.9加载可执行目标文件
7.10动态链接共享库
7.11从应用程序中加载和链接共享库
7.12位置无关代码
1.PIC数据引用
2.PIC函数调用
7.13库打桩技术
7.13.1编译时打桩
7.13.2链接时打桩