共享库与动态链接概述
使用静态库 .a文件有一些缺点
1.静态库函数被包含在每个进程的代码段中,对于并发运行上百个进程的系统,会造成极大的主存资源浪费
2.静态库函数会被和并在可执行目标中,磁盘上存放着数千个可执行文件,会造成磁盘空间的极大浪费
解决方案:
Shared Libraries(共享库)
Linux 称为 动态共享对象 (Dynamic Shared Objects,.so文件)
Windows 中的.dll 文件
原理就是: 包含目标模块的文件,每个模块包含有代码和数据,从程序中分离出来,磁盘和内存中只有一个备份,可以在装入或者运行的时候被动态加载与链接。
举个例子,printf()的代码不会包含在每个调用其的文件当中,所有进程共享调用这一份代码。
共享库优点:
第一次加载的时候进行:(load-time linking)
在linux当中通常由动态链接器自动处理
libc.so 通常按这种方式被动态链接
在开始运行后进行:
在linux中,调用dlopen()等接口实现

生成的代码文件是放在内存当中
位置无关代码(PIC)

要跳转的目标地址 = 当前PC(当前指令下一条指令地址)+ 立即数
不需要重定位
第三种情况

call 指令的功能是:
1.把下一条指令地址压栈
2.jump到那条指令
popl %ebx 的功能就是把该条指令的地址送到 %ebx寄存器当中