动态链接是一种更为现代的方法,它的优点是可执行文件的体积可以非常小。虽然运行 速度稍慢一些,但动态链接能够更加有效地利用磁盘空间,而且链接-编辑阶段的时间也会缩 短(因为链接器的有些工作被推迟到载入时)。
动态链接的目的之一是ABI
动态链接的主要目的就是把程序与它们使用的特定的函数库版本中分离开来。取而代之 的是,我们约定由系统向租序提供一个接口,该接口保持稳定,不随时间和操作系统的后续 版本发生变化。
程序可以调用接口所永诺的服务,而不必担心这些功能是怎样提供的或者它们的底层实 现是否改变。由于它是介于应用程序和函数库二进制可执行文件所提供的服务之间的接口, 所以称它为应用程序二进制接口 (Application Binary Interface,ABI)。
统一基于AT&T的SVr4的UNIX世界的目的就是提供一个单独的ABI。ABI保证函数 库存在于所有遵循约定的现器中,并保证接口的完整性。动态链接必须保证4个特定的函数 库:libc(C运行时函数库)、libsys (其他系统函数)、libX(Xwindowing)和libnsl (网络服 务)。其他的函数库可以通过静态链接,但最好采用动态链接。
过去,应用程序销售商在每次新版本的操作系统或函数库出现时都必须重新链接他们的 软件。这带来了巨大的额外工作量,因为需要照顾许多方方面面。ABI就不需要这样做,它 保证运作良好的应用程序不会受同样运作良好的底层系统软件升级的影响。
尽管单个可执行文件的启动速度稍受影响,但动态链接可以从两个方面提高性能:
1. 动态链接⑷执行文件比功能相同的静态链接可执行文件的体积小。它能够节省磁盘空 间和虚拟内存,因为函数库只有在需要时才被映射到进程中。以前,避免把函数库的拷W绑 定到每个可执行文件的惟一方法就是把服务置于内核中而不是函数库中,这就带来了可怕的 “内核膨胀”问题。
2. 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的--个单独拷 贝。操作系统内核保证映討到内存中的函数库可以被所有使用它们的进程共享。这就提供了 更好的I/O和交换空间利用率,节省了物理内存,从而提高了系统的整体性能。如果叮执行 文件是静态链接的,每个文件都将拥有一份函数库的拷贝,显然极为浪费。
例如,如果你有八个基于XView™函数库的应用程序正在运行,只需要把一个XView函 数库文本段映射到内存中。第一个进程的_&1^调用将使内核把共享对象映射到内存中。艽 余七个进程的_ap调用将使内核把已经映射到内存中的对象由各个进程共卓。这八个进程 的每一个都将共享内存中的同一份XView函数库拷贝。如果函数庳是静态链接的,将会有八 份函数库拷贝映射到内存屮,这将消耗更多的物理内存,引起更多的换页。
动态链接使得函数库的版本升级更为容易。新的函数库可以随时发布,只要安装到系统 中,旧的程序就能够自动获得新版本函数库的优点而无需重新链接。