8-1 SO-NAME 与 LINK NAME

SO-NAME 与 LINK NAME

动态库的版本号

动态库一般约定命名为libname.so.x.y.z

其中x是主版本号,用于规定库的重大升级,互不兼容。y是次版本号,表示增量升级,高版本兼容低版本。z是发布版本号,表示性能优化与bug修复,接口完全兼容。

SO-NAME

SO-NAME是共享库去除掉次版本号和发布版本号。

libname.so.x.y.z->libname.so.x

SO-NAME软链接与更新

由于版本号的特性,SO-NAME就能用来表示一个完全兼容的共享库。在Linux中,系统会在实际的共享库libname.so.x.y.z所在目录下创建一个与其SO-NAME相同的软链接,指向这个动态库。

当共享库发生更新时,只要主版本号不变,SO-NAME的软链接就会更新为指向最新的那个共享库。

SO-NAME软链接的用处

当文件A依赖于文件B时,在其.dynamic段里的DT_NEED字段就会保存文件B的值。

如果存储的是文件B的实际名字,那么一旦共享库B发生了更新,文件A就不会自动更新。因此,DT_NEED中实际存储的是SO-NAME,这样就实现了自动定向到最新版本的共享库的功能。而如果共享库的主版本号发生升级,也不会影响已有的程序。

Linux系统中实际使用ldconfig工具来完成在共享库更新过程中,SO-NAME的软链接的指向更新。

SO-NAME不能解决次版本号交会问题

可执行文件依赖更高版本的次版本号,但是系统上只存在低版本的次版本号动态库,由此导致可能的不兼容。SO-NAME无法分辨次版本号是否兼容。

这个问题在现代的系统中通过“符号版本”机制来解决。

当在编译器中需要链接某个libXXX.so.2.6.1的时候,一般只会指定-lXXX,这个XXX就是它的链接名。

不同类型的文件(静态库/动态库)可能会是同样的链接名,比如-lc在-static时查找libc.a,而在-Bdynamic(默认情况下)会查找libc.so.x.y.z