Linux共享库概述( 二 )
获取符号的地址#include
该函数实际上利用刚才返回的调用句柄 , 并传入函数名 , 这样就可以调用共享库中提供的函数了 。
关闭共享库#include
该函数会减小handle的引用的库的打开的引用系统计数 , 如果这个引用技术变成了0 , 并且其他库已经不需要用到该库中的符号 , 那么就会卸载这个库 。 系统会在这个库的依赖树中的库执行(递归)同样的过程 。 值得注意的是 , 当进程终止时 , 会隐式地对所有库执行dlclose() 。
错误判断#include
该函数主要是在dlopen调用错误后 , 获取到一个表明错误原因的字符串指针 。
2. 静态函数库
静态函数库实际上就是简单的一个普通的目标文件的集合 , 一般来说习惯用“.a”作为文件的后缀 。 可以用ar这个程序来产生静态函数库文件 。 Ar是archiver的缩写 。 静态函数库现在已经不在像以前用得那么多了 , 主要是共享函数库与之相比较有很多的优势的原因 。 慢慢地 , 大家都喜欢使用共享函数库了 。 不过 , 在一些场所静态函数库仍然在使用 , 一来是保持一些与以前某些程序的兼容 , 二来它描述起来也比较简单 。
静态库函数允许程序员把程序link起来而不用重新编译代码 , 节省了重新编译代码的时间 。 不过 , 在今天这么快速的计算机面前 , 一般的程序的重新编译也花费不了多少时间 , 所以这个优势已经不是像它以前那么明显了 。 静态函数库对开发者来说还是很有用的 , 例如你想把自己提供的函数给别人使用 , 但是又想对函数的源代码进行保密 , 你就可以给别人提供一个静态函数库文件 。 理论上说 , 使用ELF格式的静态库函数生成的代码可以比使用共享函数库(或者动态函数库)的程序运行速度上快一些 , 大概1-5% 。
创建一个静态函数库文件 , 或者往一个已经存在地静态函数库文件添加新的目标代码 , 可以用下面的命令:
ar rcs my_library.a file1.o file2.o
这个例子中是把目标代码file1.o和file2.o加入到my_library.a这个函数库文件中 , 如果my_library.a不存在则创建一个新的文件 。 在用ar命令创建静态库函数的时候 , 还有其他一些可以选择的参数 , 可以参加ar的使用帮助 。 这里不再赘述 。
一旦你创建了一个静态函数库 , 你可以使用它了 。 你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码 。 如果你用gcc来编译产生可执行代码的话 , 你可以用“-l”参数来指定这个库函数 。 你也可以用ld来做 , 使用它的“-l”和“-L”参数选项 。 具体用法可以参考info:gcc 。
共享函数库共享函数库中的函数是在当一个可执行程序在启动的时候被加载 。 如果一个共享函数库正常安装 , 所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数 。 对于Linux系统还有更多可以实现的功能:1、升级了函数库但是仍然允许程序使用老版本的函数库 。2、当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数 。3、可以在库函数被使用的过程中修改这些函数库 。
3.1. 一些约定如果你要编写的共享函数库支持所有有用的特性 , 你在编写的过程中必须遵循一系列约定 。 你必须理解库的不同的名字间的区别 , 例如它的“soname”和“real name”之间的区别和它们是如何相互作用的 。 你同样还要知道你应该把这些库函数放在你文件系统的什么位置等等 。 下面我们具体看看这些问题 。
共享库的命名
每个共享函数库都有个特殊的名字 , 称作“soname” 。 soname名字命名必须以“lib”作为前缀 , 然后是函数库的名字 , 然后是“.so” , 最后是版本号信息 。 不过有个特例 , 就是非常底层的C库函数都不是以lib开头这样命名的 。每个共享函数库都有一个真正的名字(“real name”) , 它是包含真正库函数代码的文件 。 真名有一个主版本号 , 和一个发行版本号 。 最后一个发行版本号是可选的 , 可以没有 。 主版本号和发行版本号使你可以知道你到底是安装了什么版本的库函数 。 另外 , 还有一个名字是编译器编译的时候需要的函数库的名字 , 这个名字就是简单的soname名字 , 而不包含任何版本号信息 。
- Linux Kernel 5.10.5发布:禁用FBCON加速滚动特性
- 35人共用一座坟!日本推出的“共享坟墓”火了
- 微软盘点12月OneDrive更新:网页端可创建共享库等
- Linux 5.11开始围绕PCI Express 6.0进行早期准备
- Fedora正在寻求协助 希望加快Linux 5.10 LTS内核测试进度
- Linux Mint 20.1 Ulyssa稳定版已确定延期至2021年初发布
- 英特尔Xe GPU在Linux 5.11上的性能表现不错
- MIPS架构厂商日渐式微 Linux报告其漏洞遭遇困难
- 哈啰出行:APP注册用户数达4亿,共享单车业务覆盖超460城
- 社区|社区团购是恶是善?会成为下一个共享单车吗?互联网巨头“掐架”所为何图?