2015-03-02 84 views
2

我是Linux系統的新手,我正在學習ELF文件格式閱讀本文件(http://www.skyfree.org/linux/references/ELF_Format.pdf)。 但是當我看到有關重定位的相關文檔時,在重定位計算中存在奇怪的事情。 我知道根據搬遷類型,它應用不同的計算方法。 但看看這個。如何獲得ELF文件的值?

當R型爲R_386_RELATIVE時,本文檔說明計算「B + A」的方式。 但是,「A」的含義是什麼?以及如何在ELF文件中獲得此「A」值?

請給我你的仁慈答案.......;

+0

從我的頭腦開始,我認爲它與當前的IP有關,即存儲這個值的內存地址,但我沒有文檔證明它。 – rodrigo 2015-03-02 09:12:04

回答

2

從文檔你提到:

R_386_RELATIVE

鏈接器創建了動態鏈接這種重定位類型。它的偏移成員在共享對象內提供一個位置,該對象包含表示相對地址的值。動態鏈接器計算相應的虛擬地址加上共享對象的虛擬地址加載到相對地址。此類型的重定位條目必須爲符號表索引指定0。

這意味着加數用於計算重定位字段的值。

這意味着在該執行期間共享對象被加載到存儲器中的基地址。通常,共享目標文件是使用0基礎虛擬地址構建的,但執行地址將不同。

加數

如上所示,只有Elf32_Rela條目包含一個明確的加數。類型的條目`Elf32_Rel在要修改的位置存儲隱含的加數。根據處理器架構的不同,一種形式或另一種形式可能是必要的或更方便的。因此,針對特定機器的實現可以根據上下文獨佔地使用一種形式或者以任一種形式使用。

基地址

要計算的基地址,一個確定與最低p_vaddr值要PT_LOAD段相關聯的存儲器地址。然後通過將內存地址截斷爲最大頁面大小的最接近倍數來獲得基地址。根據加載到內存中的文件種類,內存地址可能會或可能不會匹配p_vaddr值。

所以它歸結爲下:

  • 加數和從Elf32_RelElf32_Rela結構算出
  • 基地址和計算從p_vaddr。具體的計算取決於架構。

您可以使用readelf -r觀察某些二進制/庫文件的重定位部分。