链接中的符号表

时间:2017-07-30 19:04:41

标签: compiler-construction linker

我读到在两次传递链接中,在第一次传递期间,所有目标代码的符号表被组合成一个全局表,所有段都存储在带有地址的段表中。

在第二遍中,通过使用全局符号表和段表来进行符号解析。

我的问题是,符号表只包含值,符号名称和类型条目,那么链接器在第二次传递的符号解析期间如何知道全局符号表中每个符号的地址?

1 个答案:

答案 0 :(得分:2)

在汇编时定义符号时,会为其分配段:offset。如果它被声明为PUBLIC,它将存储在全局符号表中。

当段链接到可执行映像时,每个段都会获得其相对虚拟地址。将偏移量添加到此段的RVA会给出符号的值。典型的公共符号是库函数的输入。

所以问题的答案:编译器在汇编时指定偏移量以及段的名称。当段按顺序排序时,链接器在链接时指定段地址。它们一起产生所需的符号值(地址)。

如果另一个目标代码引用了这个公共符号(调用库函数),它被声明为EXTERN,并且它的值在汇编时不知道,因此它暂时设置为零并伴随着名为的数据结构重定位。 重定位指定此临时零的地址和外部符号的名称。链接器读取重定位,找到具有匹配名称的相应公共符号,然后用公共符号的值替换临时零。