たとえば、次のコマンドを実行します。
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 になっているのはなぜですか? それらがすべてテキスト セグメントの同じ場所にマップされているとは思えません。最後に、再配置テーブルが最終的な実行可能ファイルに存在するのはなぜですか? 余分なスペースを占有しませんか?また、実行可能ファイルを生成する最後のリンク コマンドのすべての参照は既に解決されていますか?