动态链接(3):共享库
1 命名方式
libname.so.x.y.z
x:主版本号,表示库的重大升级、不同主版本号之间不兼容
依赖旧版本的程序需要重新编译、才能运行
y:次版本号,库的增量升级即增加一些新的接口符号,
原来的接口符号不变,高版本向后兼容低版本
z:发布版本号,一些错误修正、性能改进等,不增加新接口、
原来接口保持不变
2 共享库的SO-NAME命令机制
- 用来记录共享库的依赖关系
- 每个共享库都有一个对应的SO-NAME,去掉次、发布版本号 系统会创建一个跟SO-NAME同名的 软连接 ,指向主版本号相同、 次版本号和发布版本号最新的共享库
依赖某个共享库的模块,都使用SO-NAME,而不是详细的版本
号,SO-NAME作为一个库的接口,利于系统升级
3 共享库的路径
- /lib:
存放系统最关键和基础的共享库,如动态链接器、C库、 数学库等,这些库主要是/bin、/sbin下程序运行、以及系统启
动所需要的库 - /usr/lib:
非系统运行所需要的关键性的共享库,比如开发时用 到的一些共享库,这些库一般不会被用户的程序或者shell脚本 用到 - /usr/local/lib:
主要存放第三方应用程序所需要的一些库
4 库的查找过程
4.1 基本过程
- ELF文件执行,动态链接器/lib/ld-linux-so.x被加载启动,到.dynamic段里面寻找ELF文件依赖的共享库
- 若该路径是绝对路径,直接到该绝对路径下面寻找
- 若该路径是相对路径,到/lib、/usr/lib、/etc/ld.so.conf配置文件指定的目录去查找共享库。
4.2 库目录缓存
- /etc/ld.so.conf存放共享库的路径,为避免每次查找,耗费时间,可以使用ldconfig生成一个缓存/etc/ld.so.cache
- 新增、删除或者更新共享库路径时,ldconfig一下更新缓存即可
5 环境变量
LD_LIBRARY_PATH
- 由若干个路径组成的环境变量,每个路径用冒号隔开
- 可以使用该变量临时改变程序依赖的共享库查找路径,而不影响系统中的其它应用程序