为什么要在可执行文件中重定位(.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 部分是映像中的位置列表,其中链接器假设的加载地址和实际加载地址之间的 差异 需要 被分解英寸
我想知道为什么有些 Windows 可执行文件确实有重定位。与 DLL 不同,当可执行文件始终可以加载到任何虚拟地址时,为什么需要它?
是的,EXE 中的重定位是可选的,可以删除。但是如果我们想要 /DYNAMICBASE
- 生成一个可以在加载时通过使用地址 space 布局随机化 (ASLR) 随机变基的可执行映像 - 我们需要 relocs。所以我只是出于安全原因才这么说。例如堆栈中的安全 cookie、控制流防护等。-所有这些都是可选的,但已使用
由于指针和地址引用,请查看此代码:
int i;
int *ptr = &i;
如果链接器假定映像基址为 0x10000
,变量 i
的地址最终将包含类似 0x12004
的内容。在用于保存指针“ptr
”的内存中,链接器将写出 0x12004
,因为那是变量 i
的地址。如果加载器出于某种原因决定加载基地址为 0x70000 的文件,则 i
的地址将为 0x72004
。 .reloc 部分是映像中的位置列表,其中链接器假设的加载地址和实际加载地址之间的 差异 需要 被分解英寸