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

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

刚刚升级到 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.43.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

/usr/lib/x86_64-linux-gnu/libgnutls.so.30libgnutls.so.30.14.10对我来说

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

答案1

以下是我解决问题的方法。请注意,最后看起来有点危险,因此希望在另一个答案或评论中提供更安全的方法。

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

在这些文件上运行nm -gC和 ,readelf -sW结果grep显示第一个文件确实包含相关符号,而第二个文件不包含。这让我相信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,一切都没有损坏,错误消息也消失了。

相关内容