在mac上面好像看不出来 PLT 和 GOT 的存在
objdump -source show_me_poor
show_me_poor: file format Mach-O 64-bit x86-64
Disassembly of section __TEXT,__text:
__text:
100000f70: 55 pushq %rbp
100000f71: 48 89 e5 movq %rsp, %rbp
100000f74: 48 83 ec 10 subq $16, %rsp
100000f78: c7 45 fc 05 00 00 00 movl $5, -4(%rbp)
100000f7f: 8b 7d fc movl -4(%rbp), %edi
100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
100000f87: 31 c0 xorl %eax, %eax
100000f89: 48 83 c4 10 addq $16, %rsp
100000f8d: 5d popq %rbp
100000f8e: c3 retq
_main:
100000f70: 55 pushq %rbp
100000f71: 48 89 e5 movq %rsp, %rbp
100000f74: 48 83 ec 10 subq $16, %rsp
100000f78: c7 45 fc 05 00 00 00 movl $5, -4(%rbp)
100000f7f: 8b 7d fc movl -4(%rbp), %edi
100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
100000f87: 31 c0 xorl %eax, %eax
100000f89: 48 83 c4 10 addq $16, %rsp
100000f8d: 5d popq %rbp
100000f8e: c3 retq
Disassembly of section __TEXT,__stubs:
__stubs:
100000f90: ff 25 7a 00 00 00 jmpq *122(%rip)
Disassembly of section __TEXT,__stub_helper:
__stub_helper:
100000f98: 4c 8d 1d 69 00 00 00 leaq 105(%rip), %r11
100000f9f: 41 53 pushq %r11
100000fa1: ff 25 59 00 00 00 jmpq *89(%rip)
100000fa7: 90 nop
100000fa8: 68 00 00 00 00 pushq $0
100000fad: e9 e6 ff ff ff jmp -26 <__stub_helper>
mac 下好像是 100000f82: e8 09 00 00 00 callq 9 <dyld_stub_binder+0x100000f90>
dyld_stub_binder
不过,算是知道或者说了解了共享库是通过动态链接 动态生成共享代码的地址,而这个地址一方面是在运行的时候生成,另一方面取决于当前指令的相对地址。这里面有两个重要的表叫PLT(程序链接表)和 GOT(全局位移表)。
额,忽然想起来了一个词语,叫动态绑定,就是运行时才知道是哪个实现。
而静态绑定,就是在编译的时候就已经确定了是哪个实现。
要更好的理解这一讲,需要结合老师推荐的书和linux 环境。
展开
作者回复: gogo同学,
你好,是的,动态绑定其实和动态链接本质上就是同一个思路。
要看对应的汇编代码,可以找一台云主机装一下Linux,Mac下连readelf这样可以读取elf格式的命令也没有。