2013-05-05 88 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'的地址作爲基本虛擬地址。所以,在運行時,它要重新定位一切。

最後,如果涉及共享庫,彙編程序和鏈接程序都不知道它們將在運行環境中的位置,因此必須重定位它們的引用。