4

たとえば、次のコマンドを実行します。

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

4

1 に答える 1

2

これは readelf の出力に対する明確な (そうであることを願っています) です。

  1. Offset は、シンボル値が移動するオフセットです。
  2. Info は 2 つのことを教えてくれます - タイプ (正確な計算はアーキテクチャによって異なります) と symtab のシンボル インデックスです。
  3. Type - ABI に従ったシンボルのタイプ
  4. Sym 値は、シンボル解像度に追加される加数です。
  5. シンボル名と加数 - シンボル名 + 加数のきれいな印刷。

計算例については、https: //web.archive.org/web/20150324024617/http ://mylinuxbook.com/readelf-command/ 詳細情報: http://docs.oracle.com/cd/E23824_01/を参照してください。 html/819-0690/chapter6-54839.html

于 2014-09-08T08:23:32.470 に答える