编译链接实战(16)静态库vs动态库
Posted 奇妙之二进制
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译链接实战(16)静态库vs动态库相关的知识,希望对你有一定的参考价值。
文章目录
基础概念
-
静态库-独立exec
我们把所有相关源代码进行编译,链接,最后生成可执行文件,这个文件不依赖于其他模块,是一个完整的可执行单元。 操作系统处理这类文件的流程是直接将elf的所有段拷贝到内存中,然后将PC指针指向entry就可以运行了,什么场景下会这样使用呢? -
简单的应用程序,不依赖于其他模块
-
依赖于其他模块,其他模块以静态库的方式链接到应用程序
优点:程序是一个完整的可执行单元,不需要操作系统去进行重定向操作 缺点:每一个依赖于某个静态库的应用程序都会包含完整的静态库,这样每一个应用程序都会占用磁盘空间和内存空间,如果这样的应用程序有成千上万,那资源浪费很大
- 动态库-非独立exec
非独立exec我们这里只讲依赖于动态库的应用程序,一般情况我们在编写应用程序的时候,会用到很多库,这些库是其他工程师已经写好了,我们直接用就可以了,最典型的就是C和C++库,我们在写应用程序的时候只需要关注我们自己的业务功能就可以了。 外部库的存在方式以静态和动态2种,静态库在上面已经分析了,接下来我们着重分析动态库 如果我们的C库已经编译成了动态库,那么我们把他链接到我们的应用程序的时候,编译器只会对所需C库的符号进行分析,并把他记录到rel.dyn里,并不会真正的把动态库中的具体内容进行拷贝,所以这样编译出的应用程序就不包括动态库的内容,等到将应用程序真正加载到操作系统去运行的时候,我们操作系统中会有一个动态链接器dl去完成外部符号的链接与重定位
优点:
- 应用程序依赖的动态库在内存中只存在一份,当然数据段是每个应用程序私有的,这样会节约磁盘空间和内存空间
- 当我们要更新动态库时,只需要更新动态库文件即可,所依赖的应用程序不需要单独更新
缺点:
- 应用程序的启动会牺牲一部分启动时间
- 动态库更新需要考虑兼容性问题(exe依赖的动态库符号在exe编译链接时已经确定,更新动态库需要保证exe所依赖的符号兼容)
静态库制作
动态库制作
以上是关于编译链接实战(16)静态库vs动态库的主要内容,如果未能解决你的问题,请参考以下文章
VS编译linux项目生成静态库并在另一个项目中静态链接的方法
linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库