引言
见到了libc.so与lib.so.6,不知道区别何在,需要先了解共享库版本号的概念和so-name命名机制
共享库版本号
版本号类型
共享库一般会不断更新以修复bug、更改接口。有些更新是不兼容的,会导致依赖该库的程序无法运行或需要重新编译才能运行。
根据兼容性,划分为不同版本号:主版本号major version number、次版本号minor version number、发布版本号release version number
主版本号表示库的重大升级。不同主版本号的库之间互不兼容,需要更改接口,并重新编译。依赖于旧共享库的程序可能需要在系统中保留一份旧版的共享库才能运行。
次版本号表示库的增量升级,即增加一些新的接口符号,并保持原有符号不变。依赖于低次版本号共享库的程序可以在高次版本号的共享库下正常运行。
发布版本号表示库的一些错误的修正、性能的改进等,接口不做变化。不同发布版本号之间完全兼容。
共享库命名文件规则
libname.so.x.y.z
x:主版本号
y:此版本号
z:发布版本号
SO-NAME命名机制
新的操作系统,包括 Solaris 和 Linux,普遍采用一种叫做 SO-NAME 的命名机制,就是把共享库的文件名去掉次版本号和发布版本号,只保留主版本号。
例如,一个共享库叫 libfoo.so.2.6.1,那么它的 SO-NAME 就是 libfoo.so.2。
在 Linux 系统中,系统会为每个共享库在它所在的目录创建一个跟它的 ”SO-NAME” 一样的软链接指向它。当共享库更新时,这个软链接会始终指向主版本号相同、次版本号和发布版本号最新的那个库文件。
例如,目录中同时有 /lib/libfoo.so.2.6.1 和 /lib/libfoo.so.2.5.3 的两个不同版本的共享库,软链接 /lib/libfoo.so.2 就会指向 /lib/libfoo.so.2.6.1 的那个共享库。
依赖于某个共享库的文件只需要保存这个共享库的 SO-NAME,就可以保证始终在使用系统中最新的主版本号的共享库了,而无需在系统中保存各种版本的共享库。