我读到,在两次通过链接中,在第一次通过期间,所有目标代码的符号表都组合到一个全局表中,所有段及其地址都存储在段表中。
在第二遍中,使用全局符号表和段表进行符号解析。
我的问题是,符号表仅包含值,符号名称和类型条目,那么链接器如何在第二遍符号解析期间从全局符号表中了解每个符号的地址?
在组装时定义符号后,该符号将被分配为segment:offset。如果声明为PUBLIC,则将其存储在全局符号表中。
当段链接到可执行映像时,每个段都获得其相对虚拟地址。将偏移量添加到该线段的RVA中可得到符号的值。典型的公共符号是库功能的条目。
因此,您的问题的答案是:偏移量是在编译时由编译器指定的,以及段的名称。当段被依次排序时,链接器在链接时指定段地址。它们一起产生所需的符号值(地址)。
如果另一个目标代码引用了该公共符号(调用库函数),则将其声明为EXTERN,并且在汇编时不知道其值,因此将其临时设置为零并附带称为relocation的数据结构。重定位指定此临时零的地址,以及外部符号的名称。链接器读取重定位,找到具有匹配名称的对应公共符号,然后用公共符号的值替换临时零。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句