2013-07-27 32 views
5

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

我找不到在MS PE/COFF Specfication明确的解释,以及谷歌搜索和试验一段时间后,所有我能找到的是:

  1. 在MS COFF规范,章5.6.2“基地重新定位类型“,据说”基地重新定位将差异的所有32位应用于偏移处的32位字段“,这意味着重定位应该考虑已经存储在指定偏移处的任何地址。但是,第5.6章(.reloc章节)只与图像文件相关,而不是目标文件。
  2. 当打印重定位表时,dumpbin实用程序会添加名为“应用于”的列,这似乎总是(无论重定位类型)包含存储在重定位站点的值。
  3. Relocation Directives chapter in the DJGPP COFF Specification明确指出,当前存储在该位置的值应该添加到重定位表条目指向的符号的地址。

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

+0

对于目标文件4.2“COFF Relocations”而不是仅适用于图像文件的5.6.2部分,是不是合适的部分? – legalize

+0

它应该是,但是4.2节并没有解释如果重定位站点的值不同于0中存储的值,这实际上很常见,并且可以使用dumpbin轻松查看。 – user2625389

回答

5

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

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

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

细节在PE/COFF规范的“COFF Relocations(Object Only)”部分中介绍(我正在查看版本3,因为我输入了这个)。

相关问题