17

我是组装新手,因此想更多地了解搬迁的概念。

  1. 为什么我们需要重新定位程序、数据?
  2. 它究竟是如何完成的?

如果有人可以用初学者级别的示例进行解释,那就太好了。

4

1 回答 1

16

汇编器有一个源文件可供查看。它必须基于该源文件构建内存映像。所以它以 0 开头的代码,也以 0 开头的数据。结果进入目标文件。

现在,链接器出现了,需要将许多目标文件组合成一个可执行文件(或内核映像,或其他)。它不能让每个人都处于 0,它们会重叠。因此,它必须重新定位地址以将每个目标文件的数据价值分配到唯一的范围。

然后,然后将映像加载到虚拟内存中,操作系统可能有充分的理由想要使用“0”以外的地址作为基本虚拟地址。因此,在运行时,它想再次重新定位所有内容。

最后,如果涉及共享库,汇编器和链接器都不知道它们在运行环境中的位置,因此必须重新定位对它们的引用。

于 2013-05-05T15:14:37.197 回答