链接中的符号表

问题描述:

我读到,在第一遍中,所有目标代码的符号表合并成一个单独的全局表,并且所有的段都使用它们的地址存储到段表中。链接中的符号表

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

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

当在装配时定义符号时,它被分配了segment:offset。如果它被声明为PUBLIC,则它存储在全局符号表中。

将段链接到可执行映像中时,每个段都会获得其相对虚拟地址的。将偏移量添加到此分段的RVA会给出符号的值。典型的公共符号是图书馆功能的入口。

所以你的问题的答案是:在汇编时由编译器指定偏移量以及段的名称。分段地址在链接时由链接器在一个接一个排序时指定。他们一起产生期望的符号值(地址)。

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

+0

这部分在哪里:偏移对存储在哪里?我的意思是在哪个表中?这个链接https://www.iecc.com/linker/linker01.html表示,全局符号表只是所有局部符号表的组合,而不仅仅是公共变量。 – Zephyr

+0

偏移值和段标识都是符号的属性。 – vitsoft

+0

编译器/汇编程序的作者决定他/她将为每种符号保留单独的表格,还是最好维护一个大表格并用指定其范围的标记(PRIVATE/PUBLIC/EXTERN )。在后一种情况下,这样的表应该被称为**符号表**而不是**全局符号表**。 – vitsoft