1、概述
前面整理了,静态连接库、可重定位目标文件、可执行文件等,还有动态库的部分没有整理。今天就把欠的账给补上。
静态库前面整理了很多,但是它有明显的缺点:其一是如果静态库更新,则使用它的用户也需要跟着更新;其二如果多个程序都使用这个静态库,那么需要把静态库的内容复制到程序中,造成了系统资源的浪费。为了解决这个问题,而产生了共享库。
2、共享库(动态连接库)
共享库是为了解决静态库缺陷的一个现代创新产物。共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。这个过程叫做动态链接,是由一个叫做 动态链接器 的程序来执行的。在Linux系统中通常用.so后缀来表示,在Windows系统中,用.dll后缀来表示,叫做动态链接库。
共享库是以两种不同的方式来 “共享” 的。首先,在任何给定的文件系统中,对于一个库只有一个.so文件。所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库的内容那样被复制和嵌入到引用它们的可执行文件中。其次,在内存中,一个共享库的.text节的一个副本可以被不同的正在运行的进程共享。
使用动态库生成可执行文件的过程中,静态的执行一部分链接,然后在程序加载时,动态完成剩余部分的链接过程。没有任何的动态库代码和数据节真的被复制到可执行文件中,而是,复制了一些重定位和符号表信息,它们使得运行时可以解析对动态库中代码和数据的引用。
3、从应用程序中加载和链接共享库
应用程序还可以在它运行时要求动态链接器加载和链接某个共享库,而无需在编译时将那些库链接到应用中。
动态链接是一项强大有用的技术。下面是一些现实世界中的例子:
分发软件。微软Windows应用的开发者常常利用共享库来分发软件更新。它们生成一个共享库的新版本,然后用户可以下载,并用它替代当前的版本。下一次它们运行应用程序时,应用将自动