web-dev-qa-db-ja.com

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

5
Zach Boyd

ここに私が問題を解決した方法があります。最後は少し危険に思えたので、別の回答やコメントでのより安全なアプローチをいただければ幸いです。

私のシステムには、libgnutls.so.30/usr/lib/x86_64-linux-gnuの2つのバージョンの/usr/local/lib/があることがわかりました。

これらのファイルでnm -gCおよびreadelf -sWgrepとともに実行すると、最初のファイルには問題のシンボルが含まれ、2番目のファイルには含まれないことがわかります。これにより、gnutlsの誤ったコピーが実行時にロードされていると信じ込ませられます。

/usr/lib/x86_64-linux-gnuのファイルはlibgnutls.so.30.14.10へのリンクであり、/usr/local/lib/x86_64-linux-gnuのファイルはlibgnutls.so.30.13.1へのリンクです。

確認:lddlibgiognutlsを実行すると、/usr/local/libバージョンにリンクしようとしていることがわかります。

詳細確認:LD_LIBRARY_PATHの変更は機能しませんでした。 ld.soのマニュアルページを見ると、これはおそらく、ld.soが呼び出されるまでに何らかの昇格された特権が得られたためであることがわかります。

Sudo suを実行してからLD_LIBRARY_PATHを変更します。この時点で、問題はlibgnutlsの2つのバージョンのリンク優先順位であると確信しています。

解決済み:信頼の飛躍を遂げ、/usr/local/lib/libgnutls.so/usr/lib/x86_64-linux-gnu/libgnutls.soファイルにリンクしましたが、同じファイルを.30バージョンにもリンクしました。これまでのところ何も壊れておらず、エラーメッセージは消えています。

3
Zach Boyd