4.1 空间与地址分配
- 链接: 将几个输入目标文件加工后合并成一个输出文件的过程
- 链接方式:
- 按序叠加
- 在有很多输入文件的情况下, 输出文件将会有很多零散的段
- 相似段合并
- 两步链接:
- 空间与地址分配
- 符号解析和重定位
- 两步链接:
- 按序叠加
4.2 符号解析和重定位
- 重定位
- 重定位表
- 绝对寻址修正和相对寻址修正的区别在于绝对寻址修正后的地址为该符号的实际地址, 而相对寻址修正后的地址为符号距离被修正位置的地址差
4.3 COMMON 块
- 在处理弱符号的时候, 就是采用与COMMON块一样的机制
- 优先链接强符号
4.4 C++相关问题
4.4.1 代码消除
- C++ 的模板机制等特性导致各处会出现重复代码, 有效的处理方式是将每个模板的实例代码存放在一个段中, 链接的时候,根据各个模板的段信息进行链接
- 函数级别的链接
- 可以减少输出文件的长度,减少空间浪费。
- 但是会造成编译和链接的复杂化
4.4.2 全局构造和析构
- .init 在main 之前运行
- .fini 在main 之后运行
4.4.3 C++ 与 ABI
- ABI 指的是代码二进制兼容性, 更关注平台特性(希望二进制代码不用改变直接到处可以运行)
- API 更关注源代码层面
- C++ 的二进制兼容性不好
4.5 静态库链接
静态库可以简单的看成是一组目标文件的集合
在运行库中, 一般一个目标文件中只有一个函数, 这是因为运行库有非常多的函数,独立的放置在目标文件中可以减少空间浪费, 避免将无效的函数链接到目标文件中去。
4.6 链接过程控制
- VC 中这种控制脚本为 .def 文件
- 一般通过ld 链接
4.7 BFD 库
- BFD 就是希望通过一种统一的接口来处理不同目标文件格式
- 将编译器和链接器本身同具体的目标文件格式隔离开来