4.1 空间和地址分配![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0db468200bcf0ebbd9fcbcd228269fc4.png)
4.1.1按序叠加
去掉头尾,每个目标文件依次合并。
问题:有多个零散的段,浪费空间;地址和空间对齐要求,造成大量内存碎片。
4.1.2相似段合并 (目前都用这种)
1.空间与地址分配:将所有目标文件的符号放进一个全局符号表,计算输出文件各个段合并后的长度和位置,建立映射关系
2.符号解析和重定位
4.1.3符号地址确定
得到初始虚拟量地址,在得到偏移量,可以计算各个符号(函数和变量)的地址。
4.2 符号解析和重定位
4.2.1重定位
编译器先根据两个极端地址和相对的偏移量记下每个符号(变量和函数)的地址,等链接器完成地址和空间分配后,在由链接器计算确定所有符号地址。
4.2.2重定位表
记录每个符号的重定位段
4.2.3符号解析
4.3.4指令修正方案
4.3 COMMON 块
4.4 C++相关问题
4.4.1重复代码消除
4.4.2全局构造与析构
4.4.3C++与ABI
ABI类似API是应用程序接口 ABI是二进制层面
4.5 静态库编译
因为printf.o里面还有其他符号,所以链接报错
4.6 链接过程控制
4.6.1链接控制脚本
vscode就是脚本控制
还有linux的Makefile文件
4.6.2最小的程序
4.6.3使用ld链接脚本
链接脚本示例(ld脚本采用汇编写的,有些则是用高级语言)
4.6.4ld脚本语法
略
BFD库
目的用统一的接口处理不同的目标文件格式。