【发布时间】:2017-06-02 21:32:18
【问题描述】:
我想知道为什么某些 Windows 可执行文件确实有重定位。与 DLL 不同,当可执行文件始终可以在任何虚拟地址加载时,为什么需要它?
【问题讨论】:
标签: windows executable portability relocation
我想知道为什么某些 Windows 可执行文件确实有重定位。与 DLL 不同,当可执行文件始终可以在任何虚拟地址加载时,为什么需要它?
【问题讨论】:
标签: windows executable portability relocation
是的,EXE 中的重定位是可选的并且可以被剥离。但是如果我们想要/DYNAMICBASE - 生成一个可以在加载时使用地址空间布局随机化(ASLR)随机重新定位的可执行映像 - 我们需要重定位。所以我说这只是出于安全原因。像堆栈中的安全 cookie、控制流保护等 - 所有这些都是可选的,但可以使用
【讨论】:
由于指针和地址引用,请查看此代码:
int i;
int *ptr = &i;
如果链接器假定图像库为0x10000,则变量i 的地址最终将包含类似0x12004 的内容。在用于保存指针“ptr”的内存中,链接器将写出0x12004,因为这是变量i 的地址。如果加载器出于某种原因决定在基地址 0x70000 处加载文件,则i 的地址将是0x72004。 .reloc 部分是映像中需要考虑链接器假定加载地址和实际加载地址之间的差异的位置列表。
【讨论】: