linux - linux动态链接器的 "no version information available"错误是什么意思?

标签 linux linker

在我们的产品中,我们发布了一些动态链接到“libpam”等系统库的 linux 二进制文件。在某些客户系统上,当程序运行时,我们在 stderr 上收到以下错误:

./authpam: /lib/libpam.so.0: no version information available (required by authpam)

应用程序运行良好并执行动态库中的代码。所以这不是一个 fatal error ,它实际上只是一个警告。

我认为当系统安装的库缺少我们的可执行文件期望的东西时,这是来自动态链接器的错误。我对动态链接过程的内部了解不多......并且谷歌搜索该主题并没有多大帮助。 :(

有谁知道是什么导致了这个错误? ...我如何诊断原因? ...以及我们如何更改可执行文件以避免此问题?

更新:客户升级到最新版本的debian“testing”,出现同样的错误。所以它不是一个过时的 libpam 库。我想我想了解链接器在提示什么?如何调查根本原因等?

最佳答案

“没有可用的版本信息”表示共享对象上的库版本号较低。例如,如果您构建二进制文件的机器上的 major.minor.patch 编号为 7.15.5,而安装机器上的 major.minor.patch 编号为 7.12.1,则 ld 将打印警告。

您可以通过使用与目标操作系统随附的共享对象版本相匹配的库( header 和共享对象)进行编译来解决此问题。例如,如果您要安装到 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。

关于linux - linux动态链接器的 "no version information available"错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/137773/

相关文章:

c - 如何在代码段中运行每个 "function"?

linux - 如何在删除前检查文件是否存在?

c++ - 如何在 2012 年在 Linux 上设置 googletest?

c++ - CMake Find_Package(PythonLibs): Does CMake give a preference to dynamic or static libraries?

linux - 从 elf 文件的 DYNAMIC 部分删除条目

c++ - SFML Project microsoft visual express 2010 到 2012 兼容性问题

编译 Lazarus 代码时,Linux 链接器标志 -lXi 未找到 lib

linux - 将 YouTrack 作为服务启动失败且没有错误消息

linux - 使用 awk 重定向命令输出

linux - shell:使用sed替换文件中的字符串