Linux共享库的组织
Linux共享库的组织
共享库版本
-
共享库兼容性
-
兼容更新:增加接口、修复Bug/不兼容更新:修改和删除接口
-
这里讨论的接口:ABI(Application Binary Interface)
-
对于C++来说,ABI兼容问题比较严重。
-
-
共享库版本命名
-
主版本号:不兼容的重大升级
-
次版本号:兼容的增量升级
-
发布版本号:接口不变
-
-
SO-NAME:
-
舍弃文件名中的次版本号和发布版本号
-
Linux系统会为每个共享库在它所在的目录创建一个跟SO-NAME相同并且指向它的软链接
-
这个软链接实际指向主版本号相同、次版本号和发布版本号最新的共享库。
-
符号版本
次版本号交会问题(Minor-revision Rendezvous Problem):SO-NAME并没有解决次版本号不向下兼容的问题
-
基于符号的版本机制:每个导出和导入的符号都有一个相关联的版本号
-
Solaris中的符号版本机制
-
版本机制:不同版本的符号集合是一种继承关系,这由一个叫符号版本脚本的文件来指定。
-
范围机制:继承时共享库中其他的全局符号都将成为共享库局部符号。
-
-
Linux中的符号版本
-
GCC对Solaris符号版本机制的扩展
-
除了可以在符号版本脚本中指定符号的版本以外,GCC还允许使用一个叫做.symver的汇编宏指令来指定符号的版本,这个汇编宏指令可以被用在GAS汇编中,也可以在GCC的C/C++源代码中以嵌入汇编指令的模式使用。
-
GCC允许多个版本的同一个符号存在于一个共享库中,也就是说,在链接层面提供了某种形式的符号重载机制。
-
-
共享库系统路径
目前大多数包括Linux在内的开源操作系统都遵守一个叫做FHS的标准,这个标准规定了一个系统中的系统文件应该如何存放,包括各个目录的结构、组织和作用,这有利于促进各个开源操作系统之间的兼容性。
-
/lib,这个位置主要存放系统最关键和基础的共享库,比如动态连机器、C语言运行库、数学库等,这些库主要是那些/bin和/sbin下的程序所要用到的库,还有系统启动时需要的库。
-
/usr/lib,这个目录下主要保存的是一些非系统运行时所需要的关键性的共享库,主要是一些开发时用到的共享库。
-
/usr/local/lib,这个目录用来放置一些跟操作系统本身并不十分相关的库,主要是一些第三方的应用程序的库。
共享库查找过程
环境变量
-
LD_LIBRARY_PATH:可以临时改变某个应用程序的共享库查找路径,而不会影响系统中的其他程序。
-
LD_PRELOAD:可以指定预先装载的一些共享库甚至是目标文件。
-
LD_DEBUG:可以打开动态链接器的调试功能
共享库的创建和安装
-
共享库的创建
-
清除符号信息:使用strip工具清除掉符号和调试信息,或者使用ld的“-s/S”参数,使得链接器生成输出文件时不产生符号信息。
-
共享库的安装:将共享库复制到某个标准的共享库目录,然后运行ldconfig,但需要系统的root权限。
-
共享库构造和析构函数
-
共享库脚本