如何处理非工作包中的共享库问题

如何处理非工作包中的共享库问题

我安装了 bind-tools,Arch linux 的 dnsutils 替代品,但没有一个工具可以工作,全部失败并出现错误:

host: error while loading shared libraries: libidn2.so.4: cannot open shared object files: No such file or directory

libidn2.so.4 的这个问题似乎是 Arch 包构建的最近问题(2019 年 1 月),并且显然已产生一些非常可怕的结果,例如使整个系统无法启动

我的问题是:(1)是等待bind-tools的维护者修复这个问题,还是尝试自己修复它,这是正确的方法吗? (2)到底发生了什么? bind-tools 需要 libidn2.so.4 但不安装它?维护人员怎么可能犯这样的错误呢?

答案1

我不运行 Arch Linux,所以我在这方面有点冒险。

您链接到的文章表明它缺少符号链接,而不是缺少包。这是有道理的,因为通常在 Linux 中,共享库在“.so”之后至少有两个八位字节的版本号,而错误只提到了一个。

我的建议是你跑

ls -l /usr/lib/libidn2.so*

看看它返回什么。如果只是返回的话

/usr/lib/libidn2.so

并且没有提到任何更具体的内容,那么我建议运行

ln -s /usr/lib/libidn2.so /usr/lib/libidn2.so.0
ln -s /usr/lib/libidn2.so /usr/lib/libidn2.so.4

我建议同时运行两者,因为您的程序似乎正在寻找该库的主要版本四,但您引用的文章正在寻找主要版本零。此修复基本上为文件 /usr/lib/libidn2.so 创建了两个别名,一个带有 .0,另一个带有 .4。

如果您看到有一个 /usr/lib/libidn2.so.something.something,并且 /usr/lib/libidn2.so 是它的符号链接,那么符号链接到更具体的文件可能更有意义。我真的不知道哪种方式一定是最好的。

您的另一种选择是将您的 libidn2 降级到出现此问题之前的版本。

至于这是如何发生的——看起来 Arch Linux 的 libidn2 维护者犯了一个错误。让我困惑的不是这件事发生了,而是……那个 bug 是 12 天前添加的。可以通过一些手动符号链接修复的错误应该需要几个小时而不是几周的时间才能修复。我并不是有意贬低 Arch Linux 维护者;我只是想贬低 Arch Linux 的维护者。我不知道他们这边发生了什么。这只是……令人沮丧。我的猜测是,这只是这个故事的冰山一角。无论如何,人就是人,我们都会犯错。有人可能已经为此自责,他们不需要我们的帮助来做到这一点。

答案2

由于这种错误在 Arch Linux 中经常出现,因此我编写了一个专门的脚本来分析包并确定它们是否正确构建。 (在 95% 的情况下,Arch Linux 软件包是正确构建的):https://github.com/eli-schwartz/dotfiles/blob/master/bin/pkg-list-linked-libraries

在bind-tools包上运行它并查找libidn2显示最新版本的bind-tools链接到libidn.so.4:

$ pkg-list-linked-libraries bind-tools libidn2
==> checking linked libraries for bind-tools-9.13.5-4-x86_64.pkg.tar.xz ...
/usr/bin/dig
  NEEDED               libidn2.so.4
/usr/bin/host
  NEEDED               libidn2.so.4
/usr/bin/nslookup
  NEEDED               libidn2.so.4

该库从哪里来?

$ pacman -Qo /usr/lib/libidn2.so.4
/usr/lib/libidn2.so.4 is owned by libidn2 2.1.0-1

根据 的输出pacman -Si bind-tools,Arch 中的 bind-tools 包需要 libidn2 包作为依赖项,这很好,因为它依赖于它。

在撰写本文时,Arch Linux 官方存储库中这两个软件包的版本与我上面检查过的 bind-tools 和 libidn2 的版本相对应:

$ expac -S '%n %v' libidn2 bind-tools
libidn2 2.1.0-1
bind-tools 9.13.5-4

所以,你显然已经安装了最新版本的bind-tools。但您声称您没有二进制文件所需的 libidn2 库。为什么不?您当前安装的 libidn2 版本是什么?检查 的输出pacman -Q libidn2

由于该软件包适用于成千上万的其他人,我的结论是您的系统已损坏,您需要正确更新系统才能安装最新版本的 libidn2。看https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported详细了解为什么会发生这种情况、如何​​正确修复它以及为什么符号链接不仅不是解决方案,而且会进一步破坏您的系统。

至于抛物线错误,那是完全相反的问题。一个完全不同的 Linux 发行版不是Arch Linux 无法使用新的 libidn2 重建其软件包,因此这些软件包错误地链接到 libidn2.so.0

如果您确实受到 Parabola bug 的困扰,那么您根本就没有使用 Arch Linux,并且您需要指定您实际上正在使用 Parabola,否则人们将不知道如何帮助您。

相关内容