动态链接库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hudazhe/article/details/79449612

动态链接库又称共享库,可执行共享库。
在前面我们提到静态库中,静态库和所有软件一样,需要定期维护和更新,如果我们想要使用一个库的最新版本,我们必须显示地将程序与更新的库重新链接。
一个 C 程序通常都会使用标准 I/O 函数,在运行时这些函数的代码会被大量的赋值到每个运行进程的文本段,是对存储器资源的极大的浪费。

于是共享库产生了,它解决了静态库的缺陷。
共享库实质上是一个目标模块,在运行时可以加载到任意的存储器位置,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由动态链接库的程序来执行的。

共享库文件通常用 .so 后缀来表示。

特点:
1. 在给定的文件系统中,一个库只能有一个.so 文件,所有引用该库的可执行目标文件共享这个 .so文件中的代码和数据。
2. 一个共享库的 .text 段的一个副本可以被不同的正在运行的进程共享。
3. 什么时候运行,什么时候的使用代码。
4. 程序不是固定放在某一位置的,不能将虚拟位置写死。
5. 动态库在编译的时候没有插入到目标文件中,所以必须在运行时插入。
6. 需要将所生成的在加载时需要标明路径 如果放在 /lib 或 /lib64 中则不需要。

生成共享库
这里写图片描述
这里写图片描述

加载这里写图片描述
此时如果我们使用 nm 对可执行文件进行查看会发现
这里写图片描述
实际的函数并没有被加载到文件中。

这是因为动态库在编译的时候没有插入到目标文件,而在运行的过程中,编译器会在相应的 /lib /lib64 中去查找相应的动态库文件,并进行动态加载。

这里写图片描述
动态库的优点
代码在内存中只保存一份,节省空间。
动态库的缺点
速度较静态库较慢。

展开阅读全文

没有更多推荐了,返回首页