【发布时间】:2013-02-19 09:18:08
【问题描述】:
在类 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 设置为 current,这在几个地方都提到过,例如
suse-wiki,
我还在上述平台上进行了测试。
问题是:为什么 libtool 在 BSD 上这样做? 为什么这被认为是“BSD 这样做的方式”?
这意味着 Linux/Darwin/SunOS 的每个兼容更改对于 BSD 来说都是不兼容的更改,因为 SOVERSION 更改。
【问题讨论】:
-
我将 libtool 追溯到 2e68bf5aecc88e67b7b33e30802f05585a59e278,该行为由 Edouard G. Parmelan 在 1999 年实现。不过,在提交摘要中甚至都没有提到。
-
tickets.musicbrainz.org/browse/LIB-33 有更多周边信息。不过,最重要的链接在凯普斯汀的回答中。
标签: shared-libraries freebsd elf bsd libtool