2014-07-01 44 views
4

引用「鏈接器和加載」的裝載機部分ELF格式的重定位信息在哪裏?

「加載時重定位遠比鏈路時重定位更簡單,因爲 整個程序被重新定位爲一個單元。[...] 後讀程序裝入內存,裝載機諮詢 在目標文件中的搬遷項目,並修復了內存 位置的項目所指向的」

也許我誤解了這一點,這是隻有在某些架構,但我的問題是:ELF格式的位置是s使哪些項目需要在加載時重新定位?我如何查詢這個列表?

回答

6

重定位可以在ELF文件的特殊重定位部分找到。您可以使用readelf --sections命令查找可執行文件或共享庫中的哪些部分,以及類型REL是否包含重定位指令。這些重定位部分的內容可以使用readelf --relocs來顯示。例如:

$ readelf --relocs /bin/ls 

Relocation section '.rela.dyn' at offset 0x16c8 contains 5 entries: 
    Offset   Info   Type   Sym. Value Sym. Name + Addend 
00000061afd8 000c00000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0 
00000061b540 006d00000005 R_X86_64_COPY  000000000061b540 optind + 0 
00000061b548 006e00000005 R_X86_64_COPY  000000000061b548 optarg + 0 
00000061b550 006a00000005 R_X86_64_COPY  000000000061b550 stderr + 0 
00000061b560 006600000005 R_X86_64_COPY  000000000061b560 stdout + 0 

Relocation section '.rela.plt' at offset 0x1740 contains 99 entries: 
    Offset   Info   Type   Sym. Value Sym. Name + Addend 
00000061b000 000100000007 R_X86_64_JUMP_SLO 0000000000000000 strcoll + 0 
00000061b008 000200000007 R_X86_64_JUMP_SLO 0000000000000000 mktime + 0 
... 

.rela.dyn部分包含到具有在加載時被重新定位而.rela.plt主要含有跳躍了用於調用函數中的共享對象時隙中的代碼或數據符號的程序的代碼的引用的引用。請注意,通常只有共享對象被編譯爲位置無關的代碼,而通常的可執行文件則不是。這是由於PIC代碼比非PIC代碼慢一些。