我知道 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].@.....