延迟绑定 PLT
测试代码:main.c
void func1(int i){
printf("%d\n",i);
}
int main() {
int a = 1;
func1(a);
return a;
}
$ gcc -g main.c -o main
$ objdump -d main
Disassembly of section .plt:
...
00000000004003e0 <.plt>:
4003e0: ff 35 22 0c 20 00 pushq 0x200c22(%rip) # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
4003e6: ff 25 24 0c 20 00 jmpq *0x200c24(%rip) # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
4003ec: 0f 1f 40 00 nopl 0x0(%rax)
00000000004003f0 <printf@plt>:
4003f0: ff 25 22 0c 20 00 jmpq *0x200c22(%rip) # 601018 <printf@GLIBC_2.2.5>
4003f6: 68 00 00 00 00 pushq $0x0
4003fb: e9 e0 ff ff ff jmpq 4003e0 <.plt>
...
00000000004004fd <func1>:
4004fd: 55 push %rbp
4004fe: 48 89 e5 mov %rsp,%rbp
400501: 48 83 ec 10 sub $0x10,%rsp
400505: 89 7d fc mov %edi,-0x4(%rbp)
400508: 8b 45 fc mov -0x4(%rbp),%eax
40050b: 89 c6 mov %eax,%esi
40050d: bf c4 05 40 00 mov $0x4005c4,%edi
400512: b8 00 00 00 00 mov $0x0,%eax
400517: e8 d4 fe ff ff callq 4003f0 <printf@plt>
40051c: c9 leaveq
40051d: c3 retq
000000000040051e <main>:
40051e: 55 push %rbp
40051f: 48 89 e5 mov %rsp,%rbp
400522: 48 83 ec 10 sub $0x10,%rsp
400526: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp)
40052d: 8b 45 fc mov -0x4(%rbp),%eax
400530: 89 c7 mov %eax,%edi
400532: e8 c6 ff ff ff callq 4004fd <func1>
400537: 8b 45 fc mov -0x4(%rbp),%eax
40053a: c9 leaveq
40053b: c3 retq
40053c: 0f 1f 40 00 nopl 0x0(%rax)
...