2013-05-05 80 views
9

我是新来的大会,因此想更多地了解重定位的概念。重新定位的含义是什么?

  1. 为什么我们需要重新定位程序,数据?
  2. 它究竟做了什么?

如果有人能够用初学者水平的例子来解释,那将会很棒。

+0

http://stackoverflow.com/questions/6002359/so-most-of-the-binary-is-composed-of-reloc-table/6092773#6092773 – JosephH 2013-05-05 15:02:57

+0

什么是您的实际编程问题?您的程序是否因为重定位问题而无法运行? – 2013-05-05 15:04:21

+0

详细的最小示例:http://stackoverflow.com/a/30507725/895245 – 2015-10-22 08:32:23

回答

12

汇编程序有一个源文件可以查看。它必须建立一个基于该源文件的内存映像。所以它从0开始,代码为0,数据开始为0。结果进入目标文件。

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

然后,图像被加载到虚拟内存中,操作系统可能有很好的理由想要使用非'0'的地址作为基本虚拟地址。所以,在运行时,它要重新定位一切。

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