6

在创建最终图像之前解决目标文件中的重定位时,链接器究竟采取了哪些步骤?更具体地说,链接器如何处理已经存储在重定位站点的值?它是否总是将其添加到最终的 VA/RVA 中,还是有时会被忽略(例如某些重定位类型)?

我在MS PE/COFF Specfication中找不到明确的解释,经过一段时间的谷歌搜索和实验,我能找到的只是:

  1. 在 MS COFF 规范的第 5.6.2 章“基本重定位类型”中,据说“基本重定位将所有 32 位差异应用于偏移处的 32 位字段”,我猜这意味着重定位应该采取考虑到任何地址已经存储在指定的偏移量。但是,第 5.6 章(.reloc 部分)仅与图像文件相关,与目标文件无关。
  2. 在打印重定位表时,dumpbin 实用程序添加了一个名为“Applied To”的列,它似乎总是(无论重定位类型)包含存储在重定位站点的值。
  3. DJGPP COFF 规范中的重定位指令一章明确指出,当前存储在该位置的值应添加到重定位表条目所指向的符号地址。

您能否指出任何(相关)文档来解释链接器如何处理重定位?

4

1 回答 1

5

“图像文件”中使用的重定位部分与“目标文件”中存在的重定位信息的用途略有不同。

与 Linux 共享库不同,Windows DLL 通常不使用与位置无关的代码。相反,它们是相对于基于固定地址的地址定义的。但是,Windows 加载程序能够在发生冲突时重新定位 DLL。为了支持这一点,DLL 映像包含重定位部分,这些部分指定在重定位映像时需要修改哪些数据。许多内部 dll 符号引用将使用“eip”(或 rip)相对寻址,因此它们可能不需要在 DLL 重定位时进行修改。

映像文件重定位始终是相对于可执行映像的基地址指定的。目标文件重定位是相对于符号表中符号的地址(在图像内,使用基于图像的首选地址)指定的。图像文件没有符号表(它们有 IAT,但那不是符号表)。目标文件中支持的重定位集比图像文件中支持的重定位集更丰富。

详细信息在 PE/COFF 规范的“COFF 重定位(仅限对象)”部分中进行了介绍(我在输入此内容时正在查看版本 3)。

于 2013-11-02T07:49:11.430 回答