インストールによりdnfが破損しています。 /usr/lib64はどのように検索パスに入り、なぜ早く入らないのですか?

インストールによりdnfが破損しています。 /usr/lib64はどのように検索パスに入り、なぜ早く入らないのですか?

centos8にRPMをインストールした後、パッケージマネージャdnfが未知のエラーによって動作が停止したことがわかりました。

Traceback (most recent call last):
File "/usr/lib64/python3.6/site-packages/libdnf/common_types.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "/usr/lib64/python3.6/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 922, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: /lib64/libdnf.so.2: undefined symbol: sqlite3_expanded_sql

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/bin/dnf", line 57, in <module>
from dnf.cli import main
File "/usr/lib/python3.6/site-packages/dnf/init.py", line 30, in <module>
import dnf.base
File "/usr/lib/python3.6/site-packages/dnf/base.py", line 29, in <module>
import libdnf.transaction
File "/usr/lib64/python3.6/site-packages/libdnf/init.py", line 3, in <module>
from . import common_types
File "/usr/lib64/python3.6/site-packages/libdnf/common_types.py", line 17, in <module>
_common_types = swig_import_helper()
File "/usr/lib64/python3.6/site-packages/libdnf/common_types.py", line 16, in swig_import_helper
return importlib.import_module('_common_types')
File "/usr/lib64/python3.6/importlib/init.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_common_types'

頭を傷つけた後、私はRPMがlibsqlite3.soの独自のコピーを/opt//libのパスにインストールし、/opt//libのエントリをインストール後にスクリプトのldに追加したので、問題があることに気づきました。だから.conf。何らかの理由で、dnfは通常使用する/usr/lib64のシステムバージョンではなくこのバージョンを選択します。

だから私の質問は/usr/lib64がld.so.confのエントリ以前の検索パスにないのはなぜですか? /usr/lib64 が設定された場所が見つかりません。 LDやカーネルにハードコードされていますか?

/usr/lib64/libdnf.so.2はすでに/usr/lib64にあるので、/usr/lib64を最初に検索してみてはいかがでしょうか?

私が解決したのは、/usr/lib64のエントリをld.so.confに追加することでした。これが最善の方法ですか?私の考えでは、/opt/にRPATHを使用してライブラリを見つけて、ld.so.confに何も追加しない方が良いと思います。

これはどのように適していますか?

答え1

検索パスで/usr/lib64がld.so.confのエントリより前になかったのはなぜですか?

他の設定がない場合、システムライブラリパスは検索パスの最後のエントリです。

/usr/lib64 の構成場所が見つかりません。 LDやカーネルにハードコードされていますか?

これはld.so動的リンカーにハードコードされています(/lib64/ld-linux-x86-64.so.2あなたの場合はそれを使用すると仮定しますx86_64)。バラよりLD_LIBRARY_PATHのデフォルト値は何ですか?もっと学ぶ。

パッケージの内容に触れることなく修正するのがおそらく最善でしょう。おわかりのように、より良い解決策は、パッケージのバイナリを設定するか、バイナリが呼び出されたときにrpathラッパーシェルスクリプトを追加して設定することです。LD_LIBRARY_PATH

関連情報