可执行文件中的代码段和数据段由目标文件合并而来,如何合并的呢?
1. 两步链接(Two-pass Linking)
采用相似段合并的方法,整个过程分两步。
1.1 空间与地址分配
扫描所有的输入目标文件,获取它们的各个段的长度、属性和位置,将相似的段合并,计算出合并后的长度与位置,并建立映射关系。将文件中的符号表的所有符号收集起来,统一放到一个全局符号表。
1.2 符号解析和重定位
使用上面步骤中得到的信息,读取段的数据、重定位信息,进行符号解析(将引用符号与定义符号建立关联)与重定位。
2. 强符号和弱符号
对C++来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号,是针对定义来说的。
2.1 多次定义的全局符号规则
- 强符号不允许被多次定义(即不同文件中不能有同名的强符号)。
- 符号在某个文件中是强符号,在其他文件中是弱符号,则该符号是强符号。
- 符号在所有文件中都是弱符号,则选占用空间最大的一个。
2.2 C++为什么允许不同类型的弱符号存在
链接器不支持符号类型,即链接器无法判断符号的类型是否一致。
网友评论