我想知道为什么有些Windows可执行文件确实有重定位。当一个可执行文件总是可以加载到任何虚拟地址时,为什么需要它,而不像DLL?
答案 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部分是图像中的位置列表,其中链接器假定的加载地址与实际加载地址<之间的差异将被考虑在内。