8.1 共享库版本
8.1.1 共享库兼容性
- 共享库的更新被分为两类:
- 兼容更新
- 不兼容更新
- 这个和二进制接口有关系 ie, ABI
- 不建议使用C++ 做共享库
8.1.2 共享库版本命名
- 形如: libname.so.x.y.z
- x 为主版本号, 表示重大升级
- y 表示此版本号, 表示增量升级
- z 表示发布版本号, 不添加任何新接口, 也不对接口进行更改
- 有些库, 如 Glibc 不遵从这个命名规则
8.1.3 SO-NAME
- 利用SO_NAME 可以自动定位到最新版本共享库的特性, 确保升级时候可以兼容
- 系统会为每个共享库建立一个跟 SO-NAME 相同的并且指向它的软连接
8.2 符号版本
- 此版本号交汇问题: 由于动态连接器在进行动态链接的时候, 只对主版本号进行判断, 如果依赖的共享库的SO-NAME 和系统中实际的共享库的SO-NAME 一致, 就不在进行检查, 带来版本号交汇的问题
8.2.1 基于符号的版本机制
- 对每个版本的全局符号添加一个标记 如 VERS_1.3
8.3 共享库路径
- 遵从 FHS 标准:
- /lib 存放系统最关键和基础的共享库
- /usr/lib 存放非系统运行时候所需要的关键共享库
- /usr/local/lib 存放第三方软件的共享库
8.4 共享库的查找过程
- 动态链接的模块所依赖的模块路径保存在 .dynamic 段里面, 由DT_NEED 标识, 如果放置相对路径, 会依次从 /lib, /usr/lib, /etc/ld.so.conf 指定的目录进行查找
- 为提高检索效率, 通过 /etc/ld.so.cache 实现缓存命中等操作
8.5 环境变量
- LD_LIBRAY_PATH 可以临时改变某个应用程序的共享库查找路径, 而不影响其他程序
- LD_PRELOAD 最优先加载
- LD_DEBUG 输出调试信息
8.6 共享库的创建和安装
- 使用 strip 清除符号信息
- 使用 attribute 可以指定共享库的构造和析构函数