(静态库相当于是提前写好的库并且编译好(即为.o文件)等调用时与源文件的.o问价一同链接生成一个完全连接的可执行目标文件,而动态库只是预先加载了动态库中的符号表)
1.静态库(.a):
将所有的相关的目标文件打包成一个单独的文件称为静态库,当连接器构造一个输出的可执行文件时,只复制静态库中被应用程序引用的目标模块
(1)静态库的优点:
方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行
(2)静态库的缺点:
①静态链接,文件会很大,往往实现很小的一个功能就需要占用很大的空间,②每次库文件升级的话,都要重新编译源文件,很不方便
2.动态库(.so):
是一个目标模块,在运行或者加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。
(1)动态库是以两种不同的方式来共享的:
①在任何给定的文件系统中,对于一个库只有一个.so文件,所有引用该库的可执行目标文件共享这个.so文件中的代码和数据,而不是像静态库那样被复制和嵌入到引用他们的可执行文件中。
- 在内存中,一个动态库的.text段的一个副本可以被不同的正在运行的进程共享。
(2)动态库运行过程:
部分链接的可执行文件的形式使得它在运行时可以和动态库链接。在部分连接的可执行文件中是没有数据和代码复制到部分链接的可执行文件中的。链接器只是复制了一些重定位和符号表信息,这些信息使得运行时可以解析动态库中代码和数据的引用
当加载器加载和运行部分链接的可执行文件时,会看到部分链接的可执行文件中包含一个.interp节,这一节包含动态链接器的路径名称,动态链接器本身就是一个共享目标文件。加载器不会像它通常所做的那样将控制传递给应用而是加载和运行这个动态链接器,然后动态链接器通过执行下面的重定位完成下面的重定位完成链接任务:重定位所有动态库的文本和数据到不相同的各个内存段;重定位 部分链接的可执行文件中 所有对于动态库所定义的符号的引用。
最后动态库链接器将控制传递给应用程序。从这个时候开始,共享库的位置就固定了,并且在程序运行过程中都不会改变
(3)动态库优点:
①不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例
②动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
(4)动态库缺点:
运行环境不同,动态库存放的位置不一样,很可能导致程序运行失败