【问题标题】:Why is libtool's "current" used as "SOVERSION" on BSD, rather than "major"?为什么在 BSD 上 libtool 的“current”被用作“SOVERSION”,而不是“major”?
【发布时间】: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 机制来决定这样的SOVERSIONcurrentrevisionage。 线索是: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


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2021-08-01
相关资源
最近更新 更多