Windows 需要在exe中重新定位

Windows 需要在exe中重新定位,windows,operating-system,executable,exe,virtual-address-space,Windows,Operating System,Executable,Exe,Virtual Address Space,当exe中的每个元素都与图像的底部相对偏移时,为什么需要重新定位表??我的意思是,即使图像被一个正偏移量(比如0X60000)剥离,为什么会有重定位表,因为我们无论如何都会使用相对于新基的RVA???关键是代码不会通过RVA或其他方式访问全局变量(全局变量和函数地址)。它们可以通过其绝对地址访问。如果可执行文件未加载到其首选地址,则应更改此地址 重新定位表正好包含这些位置。它是一个包含所有位置的表,这些位置应该根据实际基址和首选基址的差异进行调整 顺便说一句,与DLL相比,EXE通常不包含重定位

当exe中的每个元素都与图像的底部相对偏移时,为什么需要重新定位表??我的意思是,即使图像被一个正偏移量(比如0X60000)剥离,为什么会有重定位表,因为我们无论如何都会使用相对于新基的RVA???

关键是代码不会通过RVA或其他方式访问全局变量(全局变量和函数地址)。它们可以通过其绝对地址访问。如果可执行文件未加载到其首选地址,则应更改此地址

重新定位表正好包含这些位置。它是一个包含所有位置的表,这些位置应该根据实际基址和首选基址的差异进行调整

顺便说一句,与DLL相比,EXE通常不包含重定位表。这是因为它们是映射到地址空间的第一个模块,因此它们可能总是在首选地址加载。DLL的情况不同,它通常包含重定位表

Windows 7 EXE中的p.S.可能包含重新定位表,以防它们喜欢以随机地址加载。这是一个安全特性(可怜的IMHO)

编辑:


应该提到的是,函数地址并不总是通过其绝对值进行访问。在x86上,分支指令(如
jmp
call
等)具有“short”格式,可与相对偏移量一起使用。这些位置不需要在重定位表中提及。

对于EXE文件,不需要重定位表,因为可执行映像总是在其首选地址加载。可以安全地剥离重定位表。

“代码不会通过RVA或whats或ever访问全局变量(全局变量和函数地址)”这怎么可能??全局变量不进入数据段吗?数据段本身与baseGlobal变量处于相对偏移位置。全局变量可能存储在EXE数据段中。那又怎么样?他们仍然有一个绝对的虚拟地址。只需编译一个访问全局变量的示例程序,并使用调试器检查代码。你会看到链接器会把直接地址放进去有什么具体原因吗??我的意思是,为什么所有的全局变量都不能处于相对偏移呢??这难道不会让链接作者的生活更轻松吗?也许吧。但关键是可执行图像的大小和性能,而不是“链接器编写者”的生活质量。如果您有权从一开始就知道全局的绝对地址,为什么不使用这个呢?可能会发生重新定位,但它们相对较少x86 CPU没有“相对PC偏移量”寻址模式。