当 exe 中的每个元素都与图像的基础相对偏移时,为什么需要重定位表?我的意思是即使图像被0X60000的正偏移量所取代,为什么还有重定位表,因为无论如何我们都会使用相对于新基础的RVA?
问问题
1780 次
2 回答
3
关键是代码不会通过 RVA 或 whats-or-ever 访问全局变量(全局变量和函数地址)。它们通过它们的绝对地址访问。如果可执行文件未在其首选地址加载,则应更改此地址。
重定位表正好由这些地方组成。它是一个表格,列出了所有应该根据实际基地址和首选基地址的差异进行调整的地方。
顺便说一句,EXE 与 DLL 相比通常不包含重定位表。这是因为它们是第一个被映射到地址空间的模块,因此它们可能总是被加载到它们的首选地址。DLL 的情况有所不同,它通常确实包含重定位表。
PS 在 Windows 7 EXE 中可能包含重定位表,以防它们更喜欢在随机地址加载。这是一个安全功能(可怜的恕我直言)
编辑:
应该提到的是,函数地址并不总是通过它们的绝对值来访问。在 x86 分支指令(例如jmp
,call
等)上,有一个“短”格式,适用于相对偏移量。这样的地方不必在搬迁表中提及。
于 2012-03-14T16:51:14.737 回答
1
对于 EXE 文件,不需要重定位表,因为可执行映像总是在其首选地址加载。可以安全地剥离重定位表。
于 2012-03-14T20:36:58.087 回答