链接器的“两步链接”
"两部链接"(Two-pass linking),是指链接的过程分为两步:地址分配 -> 重定位。
- 地址分配:扫描输入的目标文件,分配各目标文件内各段的地址,并收集全局符号定义和引用,放入一个全局符号表。完成这一步后,所有的符号地址都被确定了[1]。
- 重定位:重定位各输入文件中引用的全局符号到其实际的地址。
在地址分配的过程中,链接器合并各输入的目标文件内相同的段,并为其分配空间和地址,如下图所示:
在输入目标文件内有个"重定位表"来保存重定位的相关信息。它由符号信息和偏移组成。重定位时就是根据符号信息去找到其他输入目标文件内定义的符号的地址,再根据符号在本段内的偏移来替换为其实际的地址。
[1]:目标文件内符号的地址是相对于其所属段段相对地址,所以段的地址被分配后,符号的地址也确定了。
参考:《程序员的自我修养》,第 4 章 1 ~ 2 节。
版权声明:本文为博主原创文章,转载请注明出处。