【问题标题】:Symbol table in linking链接中的符号表
【发布时间】:2018-01-06 07:13:54
【问题描述】:

我读到,在两遍链接中,在第一遍中,所有目标代码的符号表都被合并到一个全局表中,所有段都与其地址一起存储到段表中。

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

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

【问题讨论】:

    标签: compiler-construction linker


    【解决方案1】:

    在装配时定义符号时,会为其分配段:偏移量。如果它被声明为 PUBLIC,则它存储在全局符号表中。

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

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

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

    【讨论】:

    • 这个段:偏移对存储在哪里?我的意思是在哪张桌子上?这个链接iecc.com/linker/linker01.html,说全局符号表只是所有局部符号表的组合,而不仅仅是公共变量。
    • 偏移值和段标识都是符号的属性。
    • 编译器/汇编器的作者决定他/她是否为每种符号保留单独的表,或者是否最好维护一个大表并为每个符号补充一个指定其的标志范围(私人/公共/外部)。在后一种情况下,此类表应称为符号表而不是全局符号表
    • 所以,符号的偏移值和它的段号除了符号之外还存储在符号表中?
    • 是的,除了其他符号属性。将符号表想象为一个电子表格,每个符号一行,并包含名称、偏移量、SegmentId、类型、SourceLineNr、范围(PRIVATE/PUBLIC/EXTERN/IMPORT/EXPORT)、DLLname(如果导入)等列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2019-01-22
    相关资源
    最近更新 更多