在类 Unix 系统上,动态共享库(.so 文件)有一个SONAME
. 例如,可以使用以下命令提取它:
readelf -a libfoo.so.0.3.2 | grep SONAME
-> libfoo.so.0
。最后一部分也称为SOVERSION
. 该版本号标记了二进制兼容 (ABI) 的库版本。因此,当程序链接到库的一个版本时,如果SOVERSION
不更改,它也可以使用更高版本。
Libtool有一种-version-info
机制来决定这样SOVERSION
的current
,revision
和age
。线索是:current
在兼容更改上也会增加,并且major = current - age
在大多数系统上用于设置SOVERSION
.
但是,在 BSD(FreeBSD、NetBSD、OpenBSD)上,SOVERSION
设置为,在suse-wikicurrent
等几个地方都提到了这一点
,我还在上述平台上进行了测试。
问题是:为什么 libtool 在 BSD 上这样做? 为什么这被认为是“BSD 这样做的方式”?
这意味着 Linux/Darwin/SunOS 的每个兼容更改对于 BSD 来说都是不兼容的更改,因为这些SOVERSION
更改。