4

在类 Unix 系统上,动态共享库(.so 文件)有一个SONAME. 例如,可以使用以下命令提取它: readelf -a libfoo.so.0.3.2 | grep SONAME-> libfoo.so.0。最后一部分也称为SOVERSION. 该版本号标记了二进制兼容 (ABI) 的库版本。因此,当程序链接到库的一个版本时,如果SOVERSION不更改,它也可以使用更高版本。

Libtool有一种-version-info机制来决定这样SOVERSIONcurrent,revisionage。线索是:current在兼容更改上也会增加,并且major = current - age在大多数系统上用于设置SOVERSION.

但是,在 BSD(FreeBSD、NetBSD、OpenBSD)上,SOVERSION设置为,在suse-wikicurrent等几个地方都提到了这一点 ,我还在上述平台上进行了测试。

问题是:为什么 libtool 在 BSD 上这样做? 为什么这被认为是“BSD 这样做的方式”?

这意味着 Linux/Darwin/SunOS 的每个兼容更改对于 BSD 来说都是不兼容的更改,因为这些SOVERSION更改。

4

1 回答 1

4

根据在 GNU 邮件列表上发布的至少一位开发人员的说法,这可能被认为是一个错误:

https://lists.gnu.org/archive/html/bug-libtool/2011-05/msg00007.html

该电子邮件还充满了对各种 BSD 的库版本控制策略的有用参考,这似乎与 libtool 的行为相矛盾

于 2013-03-05T21:02:54.937 回答