7. Linux共享库的组织【《链接、装载与库》学习笔记】
共享库版本
共享库的更新可以分为两类:兼容更新、不兼容更新。
导致C语言共享库ABI改变的行为主要有:
- 导出函数的行为发生改变,不再满足旧版本规定的函数行为准则。
- 导出函数被删除
- 导出数据的结构发生变化
- 导出函数的接口发生变化
Linux规定共享库文件名必须如下:libname.so.x.y.z,其中主版本号和次版本号决定了一个共享库的接口。在linux中,系统回给每个共享库在它的所在目录创建一个跟so-name相同的指向它的软链接(Symbol Link)。
符号版本
Linux的基于符号的版本机制(Symbol Versioning)让每一个导出和导入的符号都有一个相关联的版本号。
在Solaris中,程序员可以在链接共享库时编写一种符号版本脚本的文件。
共享库系统路径
目前大多数操作系统遵守FHS(File Hierarchy Standard)标注,规定了一个系统的系统文件如何存放,包括结构,组织,作用。FHS规定,一个系统主要有两个存放共享库的位置:
/lib:主要存放最基础,关键的共享库/usr/lib:主要保存非系统运行时需要的关键性共享库,一般不会被用户的程序或shell脚本直接用到/usr/local/lib:用来放置一些跟操作熊本身并不相关的库,主要是第三方应用程序库
环境变量
LD_LIBRARY_PATH:临时改变某个应用程序的共享库查找路径
LD_PRELOAD:预先转载一些共享库
LD_DEBUG:打开动态链接器的调试功能
共享库的创建
1 | |
默认情况下,链接器在产生可执行文件时,只会在那些链接时被其他共享模块引用到的符号放到动态符号表,这样可以减少动态符号表的大小。
使用
1 | |
清除共享库或可执行文件的所有符号和调试信息。
共享库的安装
可以把共享库复制到某个标准的共享库目录,如/lib,/usr/lib,然后运行ldconfig。
共享库构造和析构函数
- 构造函数:在函数声明时加上
__attribute__((constructor)) - 析构函数:在函数声明时加上
__attribute__((destructor))
这种函数会在main函数执行完毕之后执行。
在constructor()中还可以填入优先级,优先级数字越小越优先。(析构函数相反)
7. Linux共享库的组织【《链接、装载与库》学习笔记】
http://blog.bluspace.ren/2025/12/07/7. Linux共享库的组织【《链接、装载与库》学习笔记】/