windows - 需要在 exe 中重定位

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

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

最佳答案

重点是代码不通过 RVA 或 whats-or-ever 访问全局变量(全局变量和函数地址)。他们通过他们的绝对地址访问。如果可执行文件未加载到其首选地址,则应更改此地址。

重定位表正是由那些地方组成的。它是一个表,列出了所有应该根据实际基地址和首选地址的差异进行调整的地方。

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

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

编辑:

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

关于windows - 需要在 exe 中重定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9706099/

相关文章:

c# - Winforms应用程序可以解锁/替换自己的exe文件以进行自动更新吗?

java - 如何使用 NetBeans 包含的所有库依赖项构建可执行文件?

windows - 尝试创建批处理文件以选择要打开的文件

java - "empty statements"可能会(不会)抛出哪些 Java 错误和异常?

用于验证推送通知证书的 Windows 等效 Mac Keychain Access

c++ - 是否可以从 ELF Core 文件中删除堆?

linux - 如何准确衡量性能,排除后台程序干扰?

dll - 如何从托管 DLL 获取可执行路径

python - 在提示符中使用 Python 打开文件

c++ - Visual Studio C++ - 如何避免 Visual C++ Redistributable Packages?