为什么要在可执行文件中重定位(.reloc 部分)?

Why relocations (.reloc section) in executable file?

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

是的,EXE 中的重定位是可选的,可以删除。但是如果我们想要 /DYNAMICBASE - 生成一个可以在加载时通​​过使用地址 space 布局随机化 (ASLR) 随机变基的可执行映像 - 我们需要 relocs。所以我只是出于安全原因才这么说。例如堆栈中的安全 cookie、控制流防护等。-所有这些都是可选的,但已使用

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

int i;
int *ptr = &i;

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