在 32 位系统中,每个进程实际上都有 2^32 字节的连续地址空间。那么为什么链接器生成的最终可执行代码需要可重定位。有什么要求,因为生成的所有地址都是进程自己地址空间中的虚拟地址,而其他进程不能使用相同的地址。因此,该过程可以放置在它想要的任何地方。为什么可以迁移?
问问题
925 次
3 回答
1
可执行代码并不总是包含相对地址。例如,在 Windows 上,寻址通常是绝对的(例如,对于全局数据)。
考虑两个不同的动态库。两者都是针对固定基地址 0x00100000 编译的。您的程序尝试加载它们。放置第二个 DLL 的加载器在哪里?它的首选基地址已被其他 DLL 使用。
在这种情况下,可重定位代码有助于将第二个 DLL 放置在不同的地址,并将其内部指针修补到新位置。使用固定的基地址,加载第二个 DLL 将失败。
于 2013-06-07T08:40:57.140 回答
-1
它需要可重定位,因为为了执行您的进程,需要将其放入就绪队列中的实际主内存中。现在它应该放置在主存储器中的位置不是固定的(它放置在有足够空间可用的地方),因此指令的实际地址与其虚拟地址不同。
因此,调用函数、返回等的语句需要相应地更新,指向这些函数的实际地址
于 2013-06-07T07:29:37.207 回答