apt-get 想要定义一个较旧的 GNUTLS 版本

Zac*_*oyd 6 upgrade package-management apt gnutls 18.04

刚刚升级到 18.04,当我运行时sudo apt update,它抱怨:

/usr/lib/x86_64-linux-gnu/gio/modules/libgiognutls.so: symbol gnutls_pkcs11_privkey_init version GNUTLS_3_4 not defined in file libgnutls.so.30 with link time reference Failed to load module: /usr/lib/x86_64-linux-gnu/gio/modules/libgiognutls.so

较早的信息:

跑步gio version给出:2.53.6

跑步gntls-cli -v给出:gnutls-cli 3.5.8

据我所知,这意味着apt-get想要使用GNUTLS version 3.4,当我有3.5.8.

任何关于如何进行的想法将不胜感激。我怀疑它可能在升级发行版或尝试从错误的存储库更新时没有正确解析依赖项。

有趣的是,我在打开 Octave ( https://www.gnu.org/software/octave/ )时遇到了同样的错误。


在回复评论时添加:

apt-cache policy libgnutls30 说:

libgnutls30:
  Installed: 3.5.18-1ubuntu1
  Candidate: 3.5.18-1ubuntu1
  Version table:
 *** 3.5.18-1ubuntu1 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
        100 /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

/usr/lib/x86_64-linux-gnu/libgnutls.so.30指向libgnutls.so.30.14.10

nm -D /usr/lib/x86_64-linux-gnu/libgnutls.so.30 | grep GNUTLS_3 印刷 0000000000000000 A GNUTLS_3_4

Zac*_*oyd 6

这是我解决问题的方法。请注意,最后似乎有点危险,因此在另一个答案或评论中提供更安全的方法将不胜感激。

我发现libgnutls.so.30我的系统上有两个版本,一个在 中/usr/lib/x86_64-linux-gnu,另一个在/usr/local/lib/.

对这些文件运行nm -gCand readelf -sWwithgrep显示第一个文件确实包含有问题的符号,而第二个则不包含。这让我相信gnutls在运行时加载了错误的副本。

中的文件/usr/lib/x86_64-linux-gnu是到 的链接libgnutls.so.30.14.10, 中的文件/usr/local/lib/x86_64-linux-gnu是到 的链接libgnutls.so.30.13.1

确认:运行ldd表明libgiognutls它确实尝试链接​​到该/usr/local/lib版本。

更多确认:更改LD_LIBRARY_PATH不起作用。浏览ld.so手册页可以发现,这可能是因为在调用 ld.so 时获得了一些提升的特权。

sudo su然后改变LD_LIBRARY_PATH。至此,我确信libgnutls问题出在两个版本的链接优先级上。

解决了:我只是信心十足地将其链接/usr/local/lib/libgnutls.so/usr/lib/x86_64-linux-gnu/libgnutls.so文件,也链接到.30版本。到目前为止,没有任何问题,错误消息也消失了。