为什么 objdump 不显示 ELF 二进制文件的 .got 部分的任何条目?

为什么 objdump 不显示 ELF 二进制文件的 .got 部分的任何条目?

我知道 ELF 二进制文件中 .plt 和 .got 部分之间的关​​系,即每个动态加载函数(共享库)的每个部分中都必须存在相应的条目。

事实上,存在 .plt 条目printf,因为它是从 libc 加载的:

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].@.....

相关内容