1.函数库、链接和载入
链接器的基础知识:编译器创建一个输出文件,这个文件包含了可重定位的对象,这些对象就是与源程序对应的数据和机器指令。
编译器驱动器:预处理器——>语法和语义检查器——>代码生成器——>汇编程序——>优化器——>链接器;驱动器程序。
2.动态链接的优点
可执行文件的体积可以非常小,虽然运行速度稍慢一些,但动态链接能够更加有效地利用磁盘空间,而且链接器-编辑阶段的时间也会缩短(因为链接器的有些工作被推迟到载入时)。
动态链接的目的之一是ABI
动态 链接的主要目的就是把程序与它们使用的特定的函数库版本中分离开来,取而代之的是,我们约定由系统向程序提供一个接口,该接口保持稳定,不随时间和操作系统的后序版本发生变化。程序可以调用接口承诺的服务,而不必担心这些功能是怎样提供的或者它们的底层实现是否改变。由于它是介于应用程序和函数库二进制可执行文件所提供服务之间的接口,所以称它为应用二进制接口(ABI)。
尽管单个可执行文件的启动速度稍受影响,但动态链接可以从两个方面提升性能:
<1>.动态链接可执行文件比功能相同的静态链接可执行文件的体积小。它能够节省磁盘空间和虚拟内存,因为函数库只有在需要时才被映射到进程中。
<2>.所有动态链接到某个特点函数库的可执行文件在运行时共享该函数库的一个单独拷贝,操作系统内核保证映射到内存中函数库可以被所有使用他们的进程共享。这就提供了更好的I/O和交换空间利用率,节省了物理内存,从而提高了系统的整体性能。如果可执行文件使静态链接的,每个文件都将拥有一份函数库的拷贝,显然极为浪费。
使用共享函数库的主要原因就是获得ABI的好处——使你的软件不必因新版本函数库或操作系统的发布而重新链接。附带一个好处是,它也能提高系统的总体性能。
使用静态链接的最大危险在于将来版本的操作系统可能与可执行文件所绑定的系统函数库不兼容。
3.函数库链接的5个特殊秘密
<1>.动态库文件的扩展名是".so",而静态库文件的扩展名是".a";
<2>.例如,你通过-Ithread选项,告诉编译器链接到libthread.so;
<3>.编译器期望在确定的目录找到库;
<4>.观察头文件,确认所使用的函数库;
<5>.与提取动态库中的符号相比,静态库中的符号提取的方法限制更严;
4.警惕Interpositioning
Interpostitioning就是通过编写与库函数同名的函数来取代该库函数的行为。保留标识符标识用户不能重新定义它。
5.产生链接器报告文件
ld程序中的"-D"选项是随sunOS 5.3引入的,目的是提供更好的链接-编辑调试。ld是一个复杂的程序,还有很多其他选项和约定未在此处说明。下面提供四条途径,按照复杂程度分列如下:
<1>.使用lld命令,列出可执行文件的动态依赖集,这条命令会告诉你动态链接的程序所需的函数库;
<2>.ld程序的-Dhelp选项能提供一些信息,有助于查找链接过程中出现的问题;
<3>.查看ld程序的在线文档;
<4>.阅读SunOs Linker and Libraries Manual;