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

时间:2017-06-02 21:32:18

标签: windows executable portability relocation

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

2 个答案:

答案 0 :(得分:2)

是的, EXE 中的重定位是可选的,可以删除。但是如果我们想要/DYNAMICBASE - 生成一个可以在加载时通​​过使用地址空间布局随机化(ASLR)随机重新定位的可执行映像 - 我们需要重定位。所以我只是出于安全考虑而说。比如堆栈中的安全cookie,Control Flow Guard等等。 - 所有这些都是可选的但是使用了

答案 1 :(得分:0)

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

int i;
int *ptr = &i;

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