relocation - 重定位如何在 COFF 对象(非图像)文件中工作

标签 relocation coff dumpbin

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

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

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

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

    最佳答案

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

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

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

    PE/COFF 规范的“COFF 重定位(仅对象)”部分涵盖了详细信息(我在键入此内容时正在查看第 3 版)。

    关于relocation - 重定位如何在 COFF 对象(非图像)文件中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17896989/

    相关文章:

    c - 在 ELF 可执行文件中检索 RELA 的符号名称

    c - 将数据写入.cof 文件

    c++ - 查找与 C++ dll 中的方法一起使用的参数

    dll - Dumpbin 输出含义如下 .dll 导入部分

    microcontroller - MSP430 上的 ELF 重定位类型

    c++ - 寻找搬迁的起源

    x86 - 为什么 Elf64 不使用 Elf64_Rel 在 64 位 x86 上重定位?

    c++ - VA 和内存地址

    linux - 有没有人能够创建 PE COFF 和 ELF 的混合体?

    c++ - 使用dumpbin查看C++库信息时,UNDEF和notype()是什么意思?