第五章
一、对链接的思考
目标文件并不能直接执行,它首先需要载入到链接器。链接器确认main函数为初始进入点(程序开始执行的地方),把符号引用绑定到内存地址,把所有的目标文件集中在一起,再加上库文件,从而产生可执行文件。
如果函数库的一份拷贝是可执行文件的物理组成部分,那么我们称之为静态连接;如果可执行文件只是包含了文件名,让载入器在运行时能够寻找程序所需要的函数库,那么我们称之为动态连接。
即使是在静态链接中,整个libc.a文件也并没有被全部装入到可执行文件中,所装入的只是所需要的函数。
动态链接库的主要目的就是,把程序与它们使用的特定的函数库版本中分离开来。取而代之的是,我们约定由系统向程序提供一个接口,该接口保持稳定,不随时间和操作系统的后续版本发生变化。
动态链接库的优点:
1. 可执行文件可以非常小;
2. 可更加有效地利用磁盘空间;
3. 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。操作系统内核保证映射到内存中的函数库可以被所有使用它们的进程共享。
4. 动态链接使得函数库的版本升级更为容易。
动态链接库的缺点:
1. 运行速度稍慢一点;
5.3 函数库链接的5个特殊秘密
1. 动态库文件的扩展名为".so",而静态库文件的扩展名为“.a”
2. 例如,你通过-lthread选项,告诉编译器链接到libthread.so
3. 编译器期望在确定的目录找到库。
一般默认在/usr/lib
4. 观察头文件,确定所使用的函数库
5. 与提取动态库中的符号相比,静态库中的符号提取的方法限制更严