我对 PE 文件重定位感到困惑

问题描述

维基百科关于搬迁是这么说的:

PE 文件通常不包含与位置无关的代码。反而 它们被编译为首选基地址,所有地址 由编译器/链接器发出的提前修复。如果一个PE文件 无法在其首选地址加载(因为它已被占用 通过其他东西),操作系统将重新设置它。这涉及 重新计算每个绝对地址并修改代码以使用 新的价值观。加载程序通过比较首选和实际 加载地址,并计算增量值。然后将其添加到 提出内存新地址的首选地址 地点。基重定位存储在一个列表中,并根据需要添加, 到现有的内存位置。

我很困惑,为什么除了进程的基地址之外,0x00400000认首选基地址)还有其他任何东西。我的理解是,在虚拟内存中,进程具有空内存空间的视图,其中它是唯一存在的东西。考虑到这一点,在流程本身最初之前会发生什么事情?

解决方法

事实上,在大多数情况下,当一个进程启动时,首选基地址是没有问题的!在某些情况下,例如“进程空洞”(一种应用程序替换内存中的另一个应用程序的技术),首选基地址是一个必须处理的重要问题。有关与首选地址相关的此问题的更多(低级)技术详细信息,请参阅以下链接。

Introduction to Process Hollowing