看到objdump -D /bin/bash
的结果,我发现有些奇怪。
动态链接的函数名称未附加!
以下是<.text>部分的一部分。
参见672c : call 26e0
。
...
672c: e8 af bf ff ff call 26e0 <main@@Base-0xcdc0> # <--- Here
6731: 83 c4 10 add $0x10,%esp
...
我对被叫地址26e0
感到好奇
并发现它指向<.plt.got>部分。见下文。
000026e0 <.plt.got>:
26e0: ff a3 0c 00 00 00 jmp *0xc(%ebx)
26e6: 66 90 xchg %ax,%ax
26e8: ff a3 10 00 00 00 jmp *0x10(%ebx)
...
因此,<.text>部分中的672c
称为plt部分。
但是,通常,objdump应该将plt调用显示为<***@plt>
的格式
例如
// gcc -o sample sample.c -fpic -pie
#include <stdio.h>
void main(){
printf("go");
}
请参见下面的地址615
000005f0 <main>:
...
613: 89 c3 mov %eax,%ebx
615: e8 36 fe ff ff call 450 <printf@plt> # <--- here
...
我的问题是:
为什么某些二进制文件(例如/bin/dash
中没有显示“动态链接的函数名”?