需要在exe中重定位

时间:2012-03-14 16:36:40

标签: windows operating-system executable exe virtual-address-space

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

2 个答案:

答案 0 :(得分:2)

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

重定位表完全由这些地方组成。这是一个应该根据实际基址和首选地址的差异调整的所有地方的表格。

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

P.S。在Windows 7中,EXE可能包含重定位表,以防它们更喜欢以随机地址加载。这是一个安全功能(可怜的恕我直言)

修改

应该提到的是,函数地址并不总是按其绝对值访问。在x86分支指令(例如jmpcall等)上有一个“短”格式,它与相对偏移量一起使用。搬迁表中没有提到这些地方。

答案 1 :(得分:0)

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