链接中的符号 table

Symbol table in linking

我读到在两遍链接中,在第一遍中,所有目标代码的符号 table 组合成一个全局 table,所有段都存储在段 table 中和他们的地址。

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

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

当一个符号在汇编时被定义时,它被赋值为segment:offset。如果声明为 PUBLIC,则它存储在全局符号 table 中。

当段link进入可执行table映像时,每个段获得其相对虚拟地址。将偏移量添加到该段的 RVA 得到符号的值。典型的public符号是库函数的入口。

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

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