【问题标题】:Linking with a shared library without version与没有版本的共享库链接
【发布时间】:2013-11-28 16:34:01
【问题描述】:

几个月前,我在一个 debian 上构建了一个使用 libxml2 作为共享库的 C 软件。 我创建了一个 .deb 文件来安装软件,Ubuntu 用户可以让它运行。

今天,最新版本的 Ubuntu 拥有更高版本的 libxml2。所以现在,该软件无法运行,它要求使用以前版本的 libxml2,而使其工作的唯一方法是在链接新版本的 libxml2 时构建软件。

所以我的问题是,是否可以在不需要特定版本的情况下链接到共享库(冒着软件无法在某些版本上运行的风险)?

如果不是,那么如果您无法在任何 Linux 发行版上部署您的软件,那么链接到共享库的真正优势是什么?

感谢您的帮助。

最好的问候, 文森特。

【问题讨论】:

  • 正如已经评论过的,下面的(接受的)答案没有回答这个问题。我认为根本问题确实是:如何覆盖二进制文件中记录的 SONAME,使其不包含主编号 - “libxml2.so”而不是“libxml2.so.2”。我不知道它是否有效,因为图书馆有一个带有主号码的 SONAME ...

标签: c linker shared-libraries shared


【解决方案1】:

大多数共享库都会嵌入一个SONAME。这个SONAME 用于表示二进制兼容性。比如libxml2.so.2.7.8有一个libxml2.so.2的内嵌SONAME

readelf -Wa libxml2.so.2.7.8 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libxml2.so.2]

如果 libxml2.so.2.7.9 出现,它可能仍然与 v2.7.8 二进制兼容,并且仍然具有 libxml2.so.2 的 SONAME 并且您的应用程序可以正常工作。只有当引入破坏二进制兼容性的更改时,SONAME 才会增加,从而破坏您的应用程序。

如果您想创建一个自动适用于所有发行版的包,一种方法是提供您自己的 libxml2 版本,然后修改 LD_LIBRARY_PATH 以便自动加载您的版本。

【讨论】:

  • “每个共享库都有一个嵌入的SONAME”——该陈述是错误的。拥有SONAME好习惯,但这绝不是必需的。
  • 这没有回答“是否可以在不需要特定版本的情况下链接到共享库?”
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多