当 exe 中的每个元素都位于相对于图像底部的相对偏移时,为什么需要重定位表?我的意思是,即使图像被 0X60000 的正偏移量取代,为什么还有重定位表,因为我们无论如何都会使用与新基地相关的 RVA?
最佳答案
重点是代码不通过 RVA 或 whats-or-ever 访问全局变量(全局变量和函数地址)。他们通过他们的绝对地址访问。如果可执行文件未加载到其首选地址,则应更改此地址。
重定位表正是由那些地方组成的。它是一个表,列出了所有应该根据实际基地址和首选地址的差异进行调整的地方。
顺便说一句,与 DLL 相比,EXE 通常不包含重定位表。这是因为它们是第一个映射到地址空间的模块,因此它们可能总是被加载到它们的首选地址。 DLL 的情况不同,它通常包含重定位表。
附言在 Windows 7 中,EXE 可能包含重定位表,以防它们更喜欢在随机地址加载。这是一个安全功能(可怜的恕我直言)
编辑:
应该提到的是,函数地址并不总是通过它们的绝对值访问。在 x86 上,分支指令(例如 jmp
、call
等)有一个“短”格式,它与相对偏移量一起使用。这些地方不必在搬迁表中提及。
关于windows - 需要在 exe 中重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9706099/