链接没有版本的共享库

时间:2013-11-28 16:34:01

标签: c linker shared-libraries shared

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

今天,最新版本的Ubuntu有更高版本的libxml2。所以现在,软件没有运行,它要求提供以前版本的libxml2,并且使其工作的唯一方法是在链接到新版本的libxml2时构建软件。

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

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

感谢您的帮助。

祝你好运, 文森特。

1 个答案:

答案 0 :(得分:0)

大多数共享库都有嵌入式SONAME。此SONAME用于表示二进制兼容性。例如,libxml2.so.2.7.8嵌入了SONAME libxml2.so.2:

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

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

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