2013-10-25 28 views
3

例如,運行以下命令:瞭解重定位表輸出readelf

readelf -r /bin/ls | head -n 20 

我得到以下輸出:

Relocation section '.rela.dyn' at offset 0x15b8 contains 7 entries: 
    Offset   Info   Type   Sym. Value Sym. Name + Addend 
000000619ff0 003e00000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0 
00000061a580 006f00000005 R_X86_64_COPY  000000000061a580 __progname + 0 
00000061a590 006c00000005 R_X86_64_COPY  000000000061a590 stdout + 0 
00000061a5a0 007800000005 R_X86_64_COPY  000000000061a5a0 optind + 0 
00000061a5a8 007a00000005 R_X86_64_COPY  000000000061a5a8 optarg + 0 
00000061a5b0 007400000005 R_X86_64_COPY  000000000061a5b0 __progname_full + 0 
00000061a5b8 007700000005 R_X86_64_COPY  000000000061a5b8 stderr + 0 

Relocation section '.rela.plt' at offset 0x1660 contains 105 entries: 
    Offset   Info   Type   Sym. Value Sym. Name + Addend 
00000061a018 000100000007 R_X86_64_JUMP_SLO 0000000000000000 __ctype_toupper_loc + 0 
00000061a020 000200000007 R_X86_64_JUMP_SLO 0000000000000000 getenv + 0 
00000061a028 000300000007 R_X86_64_JUMP_SLO 0000000000000000 sigprocmask + 0 
00000061a030 000400000007 R_X86_64_JUMP_SLO 0000000000000000 raise + 0 
00000061a038 007000000007 R_X86_64_JUMP_SLO 00000000004020a0 free + 0 
00000061a040 000500000007 R_X86_64_JUMP_SLO 0000000000000000 localtime + 0 
00000061a048 000600000007 R_X86_64_JUMP_SLO 0000000000000000 __mempcpy_chk + 0 

我不明白這個輸出,並希望作出一些澄清。

第1列偏移量是否指示這些符號引用在.text段中的位置? Info和Type列意味着什麼,我認爲重定位只是將符號引用映射到定義,所以我不明白如何有不同的類型?爲什麼某些符號名稱的值爲0 ......我無法想象它們全都映射到文本段中的相同位置?最後,爲什麼重定位表甚至存在於最終的可執行文件中?它不佔用額外的空間,並且所有引用已經被解析爲生成可執行文件的最後一個鏈接命令嗎?

+0

如果你瞭解搬遷,其中大多數是顯而易見的。 [解釋它的答案](http://stackoverflow.com/a/30507725/895245)。 –

+0

對於'addend',在這篇文章中有一個清晰的解釋http://bottomupcs.sourceforge.net/csbu/x3735.htm – firo

回答

1

這是一個明確的(我希望如此)到readelf輸出:

  1. 偏移是偏移量,其中符號值應該去
  2. 信息告訴我們兩兩件事 - 類型(終止精確計算依賴於拱),並在符號表中的符號索引
  3. 類型 - 根據ABI
  4. 符號值的符號的類型是將被添加到所述符號解析
  5. 符號名稱和加數加數 - 符號名稱+加數的漂亮打印。

的計算例子來看看這個: http://mylinuxbook.com/readelf-command/ 更多信息: http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-54839.html

+0

我不重複'Sym。值==添加'。例如。我有'Sym Value = 0'和漂亮的打印'Sym名稱+添加= .data - 4'。我認爲值可能是'.text'段中偏移量指向的字節。 –