刚刚升级到 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
/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
答案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
,一切都没有损坏,错误消息也消失了。