在我们的产品中,我们提供了一些动态链接到“libpam”等系统库的 Linux 二进制文件。在某些客户系统上,当程序运行时,我们会在 stderr 上收到以下错误:
./authpam: /lib/libpam.so.0: no version information available (required by authpam)
该应用程序运行良好并执行动态库中的代码。所以这不是一个致命错误,它实际上只是一个警告。
我认为当系统安装的库缺少我们的可执行文件期望的东西时,这是来自动态链接器的错误。我对动态链接过程的内部了解不多......并且谷歌搜索该主题并没有多大帮助。 :(
有谁知道导致此错误的原因是什么? ...我如何诊断原因? ...我们如何更改可执行文件以避免这个问题?
更新:客户升级到最新版本的debian“testing”,出现同样的错误。所以它不是一个过时的 libpam 库。我想我想了解链接器在抱怨什么?我如何调查根本原因等?
“没有可用的版本信息”意味着共享库上的库版本号较低。例如,如果在构建二进制文件的计算机上,major.minor.patch 编号为 7.15.5,而在安装计算机上,major.minor.patch 编号为 7.12.1,则 ld 将打印警告。
您可以通过使用与目标操作系统附带的共享对象版本匹配的库(标头和共享对象)进行编译来解决此问题。例如,如果您要安装到 RedHat 3.4.6-9,则您不想在 Debian 4.1.1-21 上进行编译。这是大多数发行版都提供特定 Linux 发行版编号的原因之一。
否则,您可以静态链接。但是,您不想使用 PAM 之类的东西来执行此操作,因此您需要实际安装与客户端生产环境相匹配的开发环境(或者至少安装并链接正确的库版本。)
您重命名 .so 文件(用版本号填充它们)的建议源于共享对象库不使用版本化符号的时代。因此,不要指望使用 .so.n.n.n 命名方案会有所帮助(很多 - 如果您的系统已被破坏,它可能会有所帮助。)
最后一个选项将使用自定义链接脚本使用具有不同次要版本号的库进行编译:http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-linker/scripts.html
为此,您需要编写一个自定义脚本,并且需要一个自定义安装程序,该安装程序使用自定义脚本对客户端的共享对象运行 ld。这要求您的客户在其生产系统上安装 gcc 或 ld。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)