objdumpがELFバイナリの.gotセクションのエントリを表示しないのはなぜですか?

objdumpがELFバイナリの.gotセクションのエントリを表示しないのはなぜですか?

私はELFバイナリの.pltと.gotセクションの間の関係を知っています。つまり、動的にロードされた各関数(共有ライブラリ)の各セクションに対応するエントリが必要です。

実際、.pltエントリはprintflibcからロードされたために存在します。

nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .plt ~/myprog | grep printf
0000000000400530 <printf@plt>:
  400530:       ff 25 22 07 20 00       jmpq   *0x200722(%rip)        # 600c58 <printf@GLIBC_2.2.5>

対応する.gotエントリが住所にあることがわかります0x600c58。 .pltセクションには、libcの関数の合計7つのエントリが含まれています。

ただし、.gotテーブルを表示すると8バイトしか表示されません。

nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .got -z ~/myprog

/home/nlykkei/myprog:     file format elf64-x86-64


Disassembly of section .got:

0000000000600c30 <.got>:
  600c30:       00 00                   add    %al,(%rax)
  600c32:       00 00                   add    %al,(%rax)
  600c34:       00 00                   add    %al,(%rax)
  600c36:       00 00                   add    %al,(%rax)

objdump.gotセクション全体をコメント(どの.gotエントリがどの.pltエントリに対応するか)と一緒に表示するのはどうですか?

ベストアンサー1

PLTが使用するGOTエントリはこの.got.pltセクションに保存されます。 PLTからGOTにマッピングする場合、逆マッピングを行う方法がないと思うので、objdump最善を尽くすのは

$ objdump -d -s -j .plt -j .got.plt sysinfo

sysinfo:     file format elf64-x86-64

Contents of section .plt:
 400420 ff35e20b 2000ff25 e40b2000 0f1f4000  .5.. ..%.. ...@.
 400430 ff25e20b 20006800 000000e9 e0ffffff  .%.. .h.........
 400440 ff25da0b 20006801 000000e9 d0ffffff  .%.. .h.........
Contents of section .got.plt:
 601000 200e6000 00000000 00000000 00000000   .`.............
 601010 00000000 00000000 36044000 00000000  ........6.@.....
 601020 46044000 00000000                    F.@.....        

Disassembly of section .plt:

0000000000400420 <.plt>:
  400420:   ff 35 e2 0b 20 00       pushq  0x200be2(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400426:   ff 25 e4 0b 20 00       jmpq   *0x200be4(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40042c:   0f 1f 40 00             nopl   0x0(%rax)

0000000000400430 <printf@plt>:
  400430:   ff 25 e2 0b 20 00       jmpq   *0x200be2(%rip)        # 601018 <printf@GLIBC_2.2.5>
  400436:   68 00 00 00 00          pushq  $0x0
  40043b:   e9 e0 ff ff ff          jmpq   400420 <.plt>

0000000000400440 <sysinfo@plt>:
  400440:   ff 25 da 0b 20 00       jmpq   *0x200bda(%rip)        # 601020 <sysinfo@GLIBC_2.2.5>
  400446:   68 01 00 00 00          pushq  $0x1
  40044b:   e9 d0 ff ff ff          jmpq   400420 <.plt>

Disassembly of section .got.plt:

0000000000601000 <_GLOBAL_OFFSET_TABLE_>:
  601000:   20 0e 60 00 00 00 00 00 00 00 00 00 00 00 00 00      .`.............
    ...
  601018:   36 04 40 00 00 00 00 00 46 04 40 00 00 00 00 00     [email protected].@.....

おすすめ記事