パッケージから取り出したコマンドを動かしたらerror while loading shared libraries: liburing.so.2: cannot open shared object file: No such file or directory って出た
【疑問】コマンドを動かしたら error while loading shared libraries。ldd・ldconfig・/etc/ld.so.conf・LD_LIBRARY_PATH【LPICレベル1】
前提のおさらい。FHS ではライブラリの置き場所は /lib と /usr/lib(Debian は /usr/lib/x86_64-linux-gnu のようなアーキテクチャ別のディレクトリも)
>>1
多くのプログラムは、共有ライブラリ(.so のファイル)を動かすときに読み込む。必要なライブラリが見つからないとこのエラーで止まる。何が要るかは ldd
>>3ldd /bin/ls の結果libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6/lib64/ld-linux-x86-64.so.2(ライブラリを探して読み込むプログラム)
さっきのコマンドは liburing.so.2 => not found やった
>>2
ライブラリはどういう順番で探されるん?
>>5
ld.so の man によると、だいたいこの順
1. 環境変数 LD_LIBRARY_PATH
2. キャッシュ /etc/ld.so.cache
3. 既定の /lib と /usr/lib
(プログラムに埋め込まれた RPATH・RUNPATH もある)
>>6
キャッシュは何で作るん?
>>7ldconfig。/etc/ld.so.conf に書いたディレクトリを調べて /etc/ld.so.cache を作り直す。Debian の /etc/ld.so.conf は include /etc/ld.so.conf.d/*.conf の1行で、中に /usr/local/lib などが書いてあった
>>8ldconfig -p でキャッシュの中身を表示できる。試したら 714 libs found in cache と出た。新しいディレクトリを使わせるなら、/etc/ld.so.conf.d/ に .conf を置いて root で ldconfig(システムに効くから試してない)
>>1
とりあえず自分だけ動かしたいときは?
>>10
LD_LIBRARY_PATH にライブラリのあるディレクトリを入れるLD_LIBRARY_PATH=/tmp/mylib ldd コマンド → liburing.so.2 => /tmp/mylib/liburing.so.2
同じ指定で動かしたら、エラーなく使い方が表示された
>>11
ずっと LD_LIBRARY_PATH に頼るのは勧められへん。全員に効かせるなら ld.so.conf と ldconfig、パッケージで入れるなら依存関係として入れてもらう
>>4
ライブラリのファイル名に数字が並んでるのは?
>>13libz.so.1 -> libz.so.1.3.1 のように、本体に細かい版の番号、プログラムが探す名前(.so.1)はそこへのリンクになってた。.so.1 の 1 が変わると互換性がない、という決まり
>>13
静的リンクのプログラムは?
>>15
ライブラリを中に取り込んであるから、読み込むものがない。ldd /sbin/ldconfig は statically linked とだけ出た(ldd の版によっては not a dynamic executable)。そのぶんファイルが大きい
>>6
何が要るかは ldd、場所の設定は ld.so.conf と ldconfig、一時的には LD_LIBRARY_PATH。エラーの名前で ldd を見たら原因が分かった
管理人のひとこと
- 共有ライブラリ(.so)は実行時に読み込まれ、見つからないと error while loading shared libraries になる。
ldd コマンドで必要なライブラリと場所(見つからなければ not found)を表示。 - 探す順:LD_LIBRARY_PATH → /etc/ld.so.cache → /lib・/usr/lib(RPATH・RUNPATH も)。
- /etc/ld.so.conf(と include される /etc/ld.so.conf.d/*.conf)にディレクトリを書き、
ldconfigでキャッシュを作り直す。ldconfig -pでキャッシュの中身を表示。 - LD_LIBRARY_PATH は一時的な指定に使う。ファイル名は libz.so.1 → libz.so.1.3.1 のようなリンクで、.so の後ろの番号が互換性の目印。