四、静态链接

可执行文件中的代码段和数据段由目标文件合并而来,如何合并的呢?

1. 两步链接(Two-pass Linking)

采用相似段合并的方法,整个过程分两步。

1.1 空间与地址分配

扫描所有的输入目标文件,获取它们的各个段的长度、属性和位置,将相似的段合并,计算出合并后的长度与位置,并建立映射关系。将文件中的符号表的所有符号收集起来,统一放到一个全局符号表。

1.2 符号解析和重定位

使用上面步骤中得到的信息,读取段的数据、重定位信息,进行符号解析(将引用符号与定义符号建立关联)与重定位。

2. 强符号和弱符号

对C++来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号,是针对定义来说的。

2.1 多次定义的全局符号规则

  • 强符号不允许被多次定义(即不同文件中不能有同名的强符号)。
  • 符号在某个文件中是强符号,在其他文件中是弱符号,则该符号是强符号。
  • 符号在所有文件中都是弱符号,则选占用空间最大的一个。

2.2 C++为什么允许不同类型的弱符号存在

链接器不支持符号类型,即链接器无法判断符号的类型是否一致。

你可能感兴趣的:(四、静态链接)