【问题标题】:Why relocations (.reloc section) in executable file?为什么在可执行文件中重定位(.reloc 部分)?
【发布时间】:2017-06-02 21:32:18
【问题描述】:

我想知道为什么某些 Windows 可执行文件确实有重定位。与 DLL 不同,当可执行文件始终可以在任何虚拟地址加载时,为什么需要它?

【问题讨论】:

    标签: windows executable portability relocation


    【解决方案1】:

    是的,EXE 中的重定位是可选的并且可以被剥离。但是如果我们想要/DYNAMICBASE - 生成一个可以在加载时使用地址空间布局随机化(ASLR)随机重新定位的可执行映像 - 我们需要重定位。所以我说这只是出于安全原因。像堆栈中的安全 cookie、控制流保护等 - 所有这些都是可选的,但可以使用

    【讨论】:

      【解决方案2】:

      由于指针和地址引用,请查看此代码:

      int i;
      int *ptr = &i;
      

      如果链接器假定图像库为0x10000,则变量i 的地址最终将包含类似0x12004 的内容。在用于保存指针“ptr”的内存中,链接器将写出0x12004,因为这是变量i 的地址。如果加载器出于某种原因决定在基地址 0x70000 处加载文件,则i 的地址将是0x72004.reloc 部分是映像中需要考虑链接器假定加载地址和实际加载地址之间的差异的位置列表。

      【讨论】:

      • 链接器可能必须在不同的基础上加载可执行文件的原因是什么?没有。
      • 如果地址被其他进程保留
      • 我不关注。你能详细说明一下吗?
      • “如果地址被其他进程保留” - 这没有意义。我们在这里谈论虚拟地址。每个进程都有自己的虚拟地址空间。
      • @SahilSingh 我同意你的观点,但让我们以全局映射文件为例,例如 DLL,它们映射到所有正在运行的进程的同一地址中的每个进程(kernel32.dll),如果链接器可以将进程加载到该地址,因为它是与 DLL 的全局映射冲突,然后它会按照我上面告诉你的那样重新定位它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多