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
gcc -shared -Wl -soname, my_soname -o library_name source_files library_files

默认情况下,链接器在产生可执行文件时,只会在那些链接时被其他共享模块引用到的符号放到动态符号表,这样可以减少动态符号表的大小。

使用

1
strip libfoo.so

清除共享库或可执行文件的所有符号和调试信息。

共享库的安装

可以把共享库复制到某个标准的共享库目录,如/lib/usr/lib,然后运行ldconfig

共享库构造和析构函数

  • 构造函数:在函数声明时加上__attribute__((constructor))
  • 析构函数:在函数声明时加上__attribute__((destructor))

这种函数会在main函数执行完毕之后执行。

constructor()中还可以填入优先级,优先级数字越小越优先。(析构函数相反)


7. Linux共享库的组织【《链接、装载与库》学习笔记】
http://blog.bluspace.ren/2025/12/07/7. Linux共享库的组织【《链接、装载与库》学习笔记】/
作者
Blauter
发布于
2025年12月7日
许可协议