共享库的绑定时间问题是常规链接的程序不会遇到的,一个在链接时用到了共享库的程序能否运行时正确运行,依赖于运行环境中这些库的有效性。当所需要的库不存在时,就会发生错误,此时,除了打印出一个晦涩的错误信息并退出之外,不会有更多的事情要做。
实际使用的共享库
本章余下的部分将分析Unix System V Release 比较早的linux系统,以及4.4 BSD的派生系统中使用的静态库技术,这三者的工作方式几乎相同,但又存在一些具有启发意义的差异,在SVR3.2的实现中,修改了链接器来支持共享库的搜索,扩展了操作系统以潜力支持运行时夹在的需求,linux 的实现需要对连接器进行一些小的挑战,并增加一个系统调用以辅助库映射,BSD/OS的实现不对链接器或者操作系统做任何改变,使用一个脚本位链接器提供必要的参数,并修改了标准C库的启动例程以实现库的映射。
下面我们实际做个实验看看。
0000000000000000 <__Z5func1v>:
0: 55 pushq %rbp
1: 48 89 e5 movq %rsp, %rbp
4: c7 45 fc 0a 00 00 00 movl $10, -4(%rbp)
b: c7 45 f8 28 00 00 00 movl $40, -8(%rbp)
12: 8b 45 fc movl -4(%rbp), %eax
15: 03 45 f8 addl -8(%rbp), %eax
18: 89 45 f4 movl %eax, -12(%rbp)
1b: 8b 45 fc movl -4(%rbp), %eax
1e: 03 45 f8 addl -8(%rbp), %eax
21: 5d popq %rbp
22: c3 retq
23: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
0000000000000030 <__Z5func2ii>:
30: 55 pushq %rbp
31: 48 89 e5 movq %rsp, %rbp
34: 48 83 ec 10 subq $16, %rsp
38: 89 7d fc movl %edi, -4(%rbp)
3b: 89 75 f8 movl %esi, -8(%rbp)
3e: 8b 45 fc movl -4(%rbp), %eax
41: 03 45 f8 addl -8(%rbp), %eax
44: 89 45 f4 movl %eax, -12(%rbp)
47: 8b 75 f4 movl -12(%rbp), %esi
4a: 48 8d 3d 3d 00 00 00 leaq 61(%rip), %rdi ## 0x8e <__Z5func3iii+0x1e>
51: b0 00 movb $0, %al
53: e8 00 00 00 00 callq 0x58 <__Z5func2ii+0x28>
58: 8b 45 fc movl -4(%rbp), %eax
5b: 03 45 f8 addl -8(%rbp), %eax
5e: 48 83 c4 10 addq $16, %rsp
62: 5d popq %rbp
63: c3 retq
64: 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
0000000000000070 <__Z5func3iii>:
70: 55 pushq %rbp
71: 48 89 e5 movq %rsp, %rbp
74: 89 7d fc movl %edi, -4(%rbp)
77: 89 75 f8 movl %esi, -8(%rbp)
7a: 89 55 f4 movl %edx, -12(%rbp)
7d: 8b 45 fc movl -4(%rbp), %eax
80: 03 45 f8 addl -8(%rbp), %eax
83: 03 45 f4 addl -12(%rbp), %eax
86: 89 45 f0 movl %eax, -16(%rbp)
89: 8b 45 f0 movl -16(%rbp), %eax
8c: 5d popq %rbp
8d: c3 retq
0000000000000000 <__Z5func1v>:
0: 55 pushq %rbp
1: 48 89 e5 movq %rsp, %rbp
4: c7 45 fc 0a 00 00 00 movl $10, -4(%rbp)
b: c7 45 f8 28 00 00 00 movl $40, -8(%rbp)
12: 8b 45 fc movl -4(%rbp), %eax
15: 03 45 f8 addl -8(%rbp), %eax
18: 89 45 f4 movl %eax, -12(%rbp)
1b: 8b 45 fc movl -4(%rbp), %eax
1e: 03 45 f8 addl -8(%rbp), %eax
21: 5d popq %rbp
22: c3 retq
23: 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
0000000000000030 <__Z5func2ii>:
30: 55 pushq %rbp
31: 48 89 e5 movq %rsp, %rbp
34: 48 83 ec 20 subq $32, %rsp
38: 89 7d fc movl %edi, -4(%rbp)
3b: 89 75 f8 movl %esi, -8(%rbp)
3e: 8b 45 fc movl -4(%rbp), %eax
41: 03 45 f8 addl -8(%rbp), %eax
44: 89 45 f4 movl %eax, -12(%rbp)
47: 8b 75 f4 movl -12(%rbp), %esi
4a: 48 8d 3d 7d 00 00 00 leaq 125(%rip), %rdi ## 0xce <__Z5func3iii+0x1e>
51: b0 00 movb $0, %al
53: e8 00 00 00 00 callq 0x58 <__Z5func2ii+0x28>
58: 8b 45 fc movl -4(%rbp), %eax
5b: 89 45 e4 movl %eax, -28(%rbp)
5e: 8b 45 f8 movl -8(%rbp), %eax
61: b9 0a 00 00 00 movl $10, %ecx
66: 99 cltd
67: f7 f9 idivl %ecx
69: 89 c1 movl %eax, %ecx
6b: 8b 45 e4 movl -28(%rbp), %eax
6e: 01 c8 addl %ecx, %eax
70: 89 45 f0 movl %eax, -16(%rbp)
73: 8b 45 f0 movl -16(%rbp), %eax
76: 83 c0 28 addl $40, %eax
79: 89 45 ec movl %eax, -20(%rbp)
7c: 8b 45 f0 movl -16(%rbp), %eax
7f: 03 45 ec addl -20(%rbp), %eax
82: 89 45 e8 movl %eax, -24(%rbp)
85: 8b 75 e8 movl -24(%rbp), %esi
88: 48 8d 3d 4f 00 00 00 leaq 79(%rip), %rdi ## 0xde <__Z5func3iii+0x2e>
8f: b0 00 movb $0, %al
91: e8 00 00 00 00 callq 0x96 <__Z5func2ii+0x66>
96: 8b 45 fc movl -4(%rbp), %eax
99: 03 45 f8 addl -8(%rbp), %eax
9c: 48 83 c4 20 addq $32, %rsp
a0: 5d popq %rbp
a1: c3 retq
a2: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
00000000000000b0 <__Z5func3iii>:
b0: 55 pushq %rbp
b1: 48 89 e5 movq %rsp, %rbp
b4: 89 7d fc movl %edi, -4(%rbp)
b7: 89 75 f8 movl %esi, -8(%rbp)
ba: 89 55 f4 movl %edx, -12(%rbp)
bd: 8b 45 fc movl -4(%rbp), %eax
c0: 03 45 f8 addl -8(%rbp), %eax
c3: 03 45 f4 addl -12(%rbp), %eax
c6: 89 45 f0 movl %eax, -16(%rbp)
c9: 8b 45 f0 movl -16(%rbp), %eax
cc: 5d popq %rbp
cd: c3 retq
0000000000003e60 <__Z5func1v>:
3e60: 55 pushq %rbp
3e61: 48 89 e5 movq %rsp, %rbp
3e64: 48 83 ec 20 subq $32, %rsp
3e68: c7 45 fc 0a 00 00 00 movl $10, -4(%rbp)
3e6f: c7 45 f8 28 00 00 00 movl $40, -8(%rbp)
3e76: 8b 45 fc movl -4(%rbp), %eax
3e79: 03 45 f8 addl -8(%rbp), %eax
3e7c: 89 45 f4 movl %eax, -12(%rbp)
3e7f: 8b 45 fc movl -4(%rbp), %eax
3e82: 89 45 e4 movl %eax, -28(%rbp)
3e85: 8b 45 f8 movl -8(%rbp), %eax
3e88: b9 0a 00 00 00 movl $10, %ecx
3e8d: 99 cltd
3e8e: f7 f9 idivl %ecx
3e90: 89 c1 movl %eax, %ecx
3e92: 8b 45 e4 movl -28(%rbp), %eax
3e95: 01 c8 addl %ecx, %eax
3e97: 89 45 f0 movl %eax, -16(%rbp)
3e9a: 8b 45 f0 movl -16(%rbp), %eax
3e9d: 83 c0 28 addl $40, %eax
3ea0: 89 45 ec movl %eax, -20(%rbp)
3ea3: 8b 45 f0 movl -16(%rbp), %eax
3ea6: 03 45 ec addl -20(%rbp), %eax
3ea9: 89 45 e8 movl %eax, -24(%rbp)
3eac: 8b 75 e8 movl -24(%rbp), %esi
3eaf: 48 8d 3d be 00 00 00 leaq 190(%rip), %rdi ## 0x3f74 <_printf+0x3f74>
3eb6: b0 00 movb $0, %al
3eb8: e8 b1 00 00 00 callq 0x3f6e <_printf+0x3f6e>
3ebd: 8b 45 fc movl -4(%rbp), %eax
3ec0: 03 45 f8 addl -8(%rbp), %eax
3ec3: 48 83 c4 20 addq $32, %rsp
3ec7: 5d popq %rbp
3ec8: c3 retq
3ec9: 0f 1f 80 00 00 00 00 nopl (%rax)
0000000000003ed0 <__Z5func2ii>:
3ed0: 55 pushq %rbp
3ed1: 48 89 e5 movq %rsp, %rbp
3ed4: 48 83 ec 20 subq $32, %rsp
3ed8: 89 7d fc movl %edi, -4(%rbp)
3edb: 89 75 f8 movl %esi, -8(%rbp)
3ede: 8b 45 fc movl -4(%rbp), %eax
3ee1: 03 45 f8 addl -8(%rbp), %eax
3ee4: 89 45 f4 movl %eax, -12(%rbp)
3ee7: 8b 75 f4 movl -12(%rbp), %esi
3eea: 48 8d 3d 99 00 00 00 leaq 153(%rip), %rdi ## 0x3f8a <_printf+0x3f8a>
3ef1: b0 00 movb $0, %al
3ef3: e8 76 00 00 00 callq 0x3f6e <_printf+0x3f6e>
3ef8: 8b 45 fc movl -4(%rbp), %eax
3efb: 89 45 e4 movl %eax, -28(%rbp)
3efe: 8b 45 f8 movl -8(%rbp), %eax
3f01: b9 0a 00 00 00 movl $10, %ecx
3f06: 99 cltd
3f07: f7 f9 idivl %ecx
3f09: 89 c1 movl %eax, %ecx
3f0b: 8b 45 e4 movl -28(%rbp), %eax
3f0e: 01 c8 addl %ecx, %eax
3f10: 89 45 f0 movl %eax, -16(%rbp)
3f13: 8b 45 f0 movl -16(%rbp), %eax
3f16: 83 c0 28 addl $40, %eax
3f19: 89 45 ec movl %eax, -20(%rbp)
3f1c: 8b 45 f0 movl -16(%rbp), %eax
3f1f: 03 45 ec addl -20(%rbp), %eax
3f22: 89 45 e8 movl %eax, -24(%rbp)
3f25: 8b 75 e8 movl -24(%rbp), %esi
3f28: 48 8d 3d 45 00 00 00 leaq 69(%rip), %rdi ## 0x3f74 <_printf+0x3f74>
3f2f: b0 00 movb $0, %al
3f31: e8 38 00 00 00 callq 0x3f6e <_printf+0x3f6e>
3f36: 8b 45 fc movl -4(%rbp), %eax
3f39: 03 45 f8 addl -8(%rbp), %eax
3f3c: 48 83 c4 20 addq $32, %rsp
3f40: 5d popq %rbp
3f41: c3 retq
3f42: 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 nopw %cs:(%rax,%rax)
0000000000003f50 <__Z5func3iii>:
3f50: 55 pushq %rbp
3f51: 48 89 e5 movq %rsp, %rbp
3f54: 89 7d fc movl %edi, -4(%rbp)
3f57: 89 75 f8 movl %esi, -8(%rbp)
3f5a: 89 55 f4 movl %edx, -12(%rbp)
3f5d: 8b 45 fc movl -4(%rbp), %eax
3f60: 03 45 f8 addl -8(%rbp), %eax
3f63: 03 45 f4 addl -12(%rbp), %eax
3f66: 89 45 f0 movl %eax, -16(%rbp)
3f69: 8b 45 f0 movl -16(%rbp), %eax
3f6c: 5d popq %rbp
3f6d: c3 retq
因篇幅问题不能全部显示,请点此查看更多更全内容