Debian Buster 中的库不匹配?

Posted

技术标签:

【中文标题】Debian Buster 中的库不匹配?【英文标题】:Mismatched libraries in Debian Buster? 【发布时间】:2020-06-02 16:02:14 【问题描述】:

注意:所有这些工作都是在封闭的网络上完成的(即无法访问互联网)。

我被发生的 GCC 5.0+ STL 更改所困扰。据说其他帖子从 GCC 5.0 开始,标准模板库经历了更新,现在有旧版 stl 和严格合规性 stl。使用 _GLIBCXX_USE_CXX11_ABI 1 构建的代码不会与使用 _GLIBCXX_USE_CXX11_ABI 0 构建的代码链接。设置为 0 表示旧版 stl(即 std::string),而设置为 1 则构造 std::__cxx11::string。

如果所有用户代码都被重新构建以匹配新库,那么可以使用,但是如果 debian 包的构建不同怎么办???现在呢?

例如,将 Debian 8.11 (Jessie) 系统升级到 10.3 (Buster),升级中包括 Boost 和 Protobuf。 现在使用默认的 _GLIBCXX_USE_CXX11_ABI 1 构建我的软件并使用 Protobuf 获取链接错误,因为它似乎是使用 pre-gcc 5.0 或 ABI 设置为 0 构建的 Protobuf。Boost 还有其他问题,它无法找到一些 std::__cxx1112::string (看过一次)或只是 std::string。

下载了 Boost 的源代码,转移到封闭网络,并使用 ABI 1 构建,我的代码现在链接到 boost,但仍然无法链接到 protobuf。 使用 ABI 0 构建了 Boost 和我的代码,现在两者的链接都成功了。

仍在获取 Buster 的新镜像以确定是否可以解决,但是我拥有的版本有不匹配的库(不兼容)

这只是一个警告,并非所有事情都像看起来那样。

Boost 从 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰写本文时,Glassfish 与 Buster 版本的 JDK 不兼容。

【问题讨论】:

我不敢相信我居然称它为there。 知道 JDK11 与 Glassfish 不兼容,因此 Debian 软件包被挑选用于升级,而不是完整的 apt-get upgrade 和 apt-get dist-upgrade。因此升级了一组最小的软件包。 完成完整升级和 dist-upgrade 时,链接错误会解决,但随后会遇到 Glassfish 问题。似乎还有其他真正的依赖项未在精选包的依赖项列表中列出。因此,其他一些包(不知道是哪个包)允许未解析的 protobuf 奇迹般地被解析。 【参考方案1】:

我也在question leading up to this 一个。

我会挑几点来说明:

如果重新构建所有用户代码以匹配新库,则可以正常使用

确实

但是如果 debian 包的构建不同呢???现在呢?

这通常不会发生。 Debian 的 QA 和构建服务器受到非常严格的控制,除非有人非常严重地滑倒,否则不会出现这种情况 - 即便如此,除非软件包没有用户,否则它会在测试中立即被发现。

[...] 使用 Protobuf 出现链接错误,因为似乎 Protobuf 是使用 pre-gcc 5.0 或 ABI 设置为 0 构建的 [...]

如果您似乎仍然处于这种情况,我们可以像我之前的回答一样进行一些分析,但这次是针对 libprotobufX。可能发生的事情是

您的库路径中有恶意(非发行版)共享库(检查 ldconfig、LD_LIBRARY_PATH、-L 标志)

或者在 成功 链接上(因此使用解决方法)检查​​链接的二进制文件上的 ldd 是否从预期位置加载 libprotobufXXX.so。如果有意外的位置,可能会有

ldconfig 位置,如上所述

可能有RPATH/RUNPATH 条目被链接器烘焙到ELF 映像中(在您的构建脚本中查找-Wl,rpath 或类似内容)。要检查二进制文件以确认这一点:

  objdump -x binary-or-library |grep RPATH
  objdump -x binary-or-library |grep RUNPATH

您的升级可能未成功更新该软件包(检查升级过程是否有错误、您的 repo-mirror 的状态)

您有一个非 Debian(或不受支持)的 apt 源列表(检查 /etc/apt/sources.list/etc/apt/sources.list.d/*.list) - 这些构建可能无法维持相同级别的发行版一致性

副业,通常是规范的启动板 PPA 倾向于重用发行版构建基础架构,所以我认为只要发行版/组件条目与您的安装匹配,它们通常就可以了

或者,您可以在完整的apt-get update 之后检查 APT 缓存的内容,例如

 apt-cache show libprotobuf.*

顺便说一下,如果您发现软件包有问题,这也会给您维护者和联系地址。 (可能有更适合这个的错误跟踪器,我在这个领域不知道)

希望这可以帮助您找到潜在客户


仍在获取 Buster 的新镜像以确定是否可以解决

听起来不错

但是我的版本有不匹配的库(不兼容)

我不知道这是什么意思

Boost 从 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰写本文时,Glassfish 与 Buster 版本的 JDK 不兼容。

哇,这些都是大跳跃。如果 JDK 有问题,IME 有助于安装 Java 8 或 9 JDK/JRE 并将其设为默认值,例如

$ update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode

【讨论】:

“但是我的版本库不匹配(不兼容)” 指的是,我正在使用的当前镜像(封闭网络)存在 libprotobuf17 和 boost1.67 的问题。这就是为什么我要等待最新的软件包副本来替换当前镜像。

以上是关于Debian Buster 中的库不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Debian Buster 上安装 php 调试符号?

从 Debian Stretch 升级到 Buster 后出现 OCS 错误

如何在 debian:buster 中使用脚本安装 mysql-server 而不会询问任何配置问题?

debian10 buster入坑指北 - 常用工具

Debian Buster Nginx 布署 Brophp 项目(类 Thinkphp)

存储库“http://security.debian.org/debian-security buster/updates InRelease”将其“Suite”值从“stable”更改为“oldst