機能しないパッケージの共有ライブラリの問題を処理する方法

機能しないパッケージの共有ライブラリの問題を処理する方法

dnsutilsを置き換えるArch LinuxであるBind-toolsをインストールしましたが、どのツールも機能せず、すべてエラーで失敗します。

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)バインディングツール管理者がこの問題を解決するのを待つのが正しい方法ですか、それとも直接解決しようとしていますか? (2)何が起こりましたか?バインディングツールにはlibidn2.so.4が必要ですが、インストールしませんか?メンテナンス担当者はどのようにして間違いを犯すことができますか?

答え1

私はArch Linuxを実行していないので、これに関しては少し冒険的です。

リンクした記事によると、パッケージが欠落しているのではなく、シンボリックリンクが見つからないことがわかります。通常、Linux共有ライブラリには「.so」の後にバージョン番号が2つ以上のオクテットがありますが、エラーには1つだけ言及されるため、これは意味があります。

私の提案はあなたが実行することです

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

あなたのプログラムはライブラリのメジャーバージョン4を探しているようですが、参照した記事ではメジャーバージョン0を探しているので、両方を実行することをお勧めします。この修正は、デフォルトで/usr/lib/libidn2.soファイルに対して2つのエイリアスを生成します。 1つは.0、もう1つは.4です。

/usr/lib/libidn2.so.something.somethingがあり、/usr/lib/libidn2.soがそれへのシンボリックリンクである場合は、より具体的なファイルにシンボリックリンクする方が合理的です。どのような方法が必ずしも最善かどうかはわかりません。

別のオプションは、libidn2をこの問題以前のバージョンにダウングレードすることです。

どのようにこれが起こったのかについては、libidn2のArch Linux管理者が間違いを犯したようです。私を混乱させるのは、これが起こったということではなく、そのバグが12日前に追加されたということです。いくつかの手動シンボリックリンクで修正できるバグは、修正に数週間ではなく数時間かかります。私はArch Linux管理者を責めるつもりはありません。ちょうどArch Linuxの管理者を責めることです。私は彼らに何が起こったのかわかりません。ただ…苦しいです。私の推測は、これが物語の氷山の一部にすぎないということです。とにかく人は人であり、私たちはみんな間違いを犯します。誰かがすでにこれについて自責しているかもしれませんが、彼らはそうするために私たちの助けを必要としません。

答え2

このエラーはArch Linuxで頻繁に発生するため、パッケージを分析して正しく構築されたことを確認するための特別なスクリプトを作成しました。 (Arch Linuxパッケージは95%の時間に正しく構築されます。):https://github.com/eli-schwartz/dotfiles/blob/master/bin/pkg-list-linked-libraries

これをバインディングツールパッケージで実行し、libidn2を見つけると、最新バージョンのバインディングツールが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-toolsArchのバインディングツールパッケージは依存関係としてlibidn2パッケージを必要とします。

この記事を書いた時点で、公式のArch Linuxリポジトリにあるこれら2つのパッケージのバージョンは、上記で確認したバインドツールとlibidn2のバージョンと一致します。

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

したがって、最新バージョンのバインディングツールがインストールされています。しかし、バイナリに必要な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のバグに苦しんでいる場合は、Arch Linuxをまったく使用しないこと、実際にParabolaを使用していることを明記する必要があります。そうでなければ、人々がどのように助けることができるかはわかりません。

関連情報