読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】コマンドを動かしたら error while loading shared libraries。ldd・ldconfig・/etc/ld.so.conf・LD_LIBRARY_PATH【LPICレベル1】

17レスカテゴリ:Linux
1: 名無しさん

パッケージから取り出したコマンドを動かしたら
error while loading shared libraries: liburing.so.2: cannot open shared object file: No such file or directory って出た

2: 名無しさん

前提のおさらい。FHS ではライブラリの置き場所は /lib と /usr/lib(Debian は /usr/lib/x86_64-linux-gnu のようなアーキテクチャ別のディレクトリも)

3: 名無しさん

>>1
多くのプログラムは、共有ライブラリ(.so のファイル)を動かすときに読み込む。必要なライブラリが見つからないとこのエラーで止まる。何が要るかは ldd

4: 名無しさん

>>3
ldd /bin/ls の結果
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2(ライブラリを探して読み込むプログラム)
さっきのコマンドは liburing.so.2 => not found やった

5: 名無しさん

>>2
ライブラリはどういう順番で探されるん?

6: 名無しさん

>>5
ld.so の man によると、だいたいこの順
1. 環境変数 LD_LIBRARY_PATH
2. キャッシュ /etc/ld.so.cache
3. 既定の /lib と /usr/lib
(プログラムに埋め込まれた RPATH・RUNPATH もある)

7: 名無しさん

>>6
キャッシュは何で作るん?

8: 名無しさん

>>7
ldconfig。/etc/ld.so.conf に書いたディレクトリを調べて /etc/ld.so.cache を作り直す。Debian の /etc/ld.so.conf は include /etc/ld.so.conf.d/*.conf の1行で、中に /usr/local/lib などが書いてあった

9: 名無しさん

>>8
ldconfig -p でキャッシュの中身を表示できる。試したら 714 libs found in cache と出た。新しいディレクトリを使わせるなら、/etc/ld.so.conf.d/ に .conf を置いて root で ldconfig(システムに効くから試してない)

10: 名無しさん

>>1
とりあえず自分だけ動かしたいときは?

11: 名無しさん

>>10
LD_LIBRARY_PATH にライブラリのあるディレクトリを入れる
LD_LIBRARY_PATH=/tmp/mylib ldd コマンド → liburing.so.2 => /tmp/mylib/liburing.so.2
同じ指定で動かしたら、エラーなく使い方が表示された

12: 名無しさん

>>11
ずっと LD_LIBRARY_PATH に頼るのは勧められへん。全員に効かせるなら ld.so.conf と ldconfig、パッケージで入れるなら依存関係として入れてもらう

13: 名無しさん

>>4
ライブラリのファイル名に数字が並んでるのは?

14: 名無しさん

>>13
libz.so.1 -> libz.so.1.3.1 のように、本体に細かい版の番号、プログラムが探す名前(.so.1)はそこへのリンクになってた。.so.1 の 1 が変わると互換性がない、という決まり

15: 名無しさん

>>13
静的リンクのプログラムは?

16: 名無しさん

>>15
ライブラリを中に取り込んであるから、読み込むものがない。ldd /sbin/ldconfig は statically linked とだけ出た(ldd の版によっては not a dynamic executable)。そのぶんファイルが大きい

17: 名無しさん

>>6
何が要るかは ldd、場所の設定は ld.so.conf と ldconfig、一時的には LD_LIBRARY_PATH。エラーの名前で ldd を見たら原因が分かった

管理人のひとこと