これは、/etc/ld.so.conf
を使用したときに気付いた特殊性を扱っているため、重複ではありません。
動的リンカーがライブラリーを検索するパスを取得するには、ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
コマンドを実行します。 /etc/ld.so.conf
にパスがリストされていない場合。前のコマンドの出力は
/lib
/usr/lib
最初に/lib
を検索し、次に/usr/lib
を検索すると考えました。 /usr/local/lib
に/etc/ld.so.conf
などの新しいパスを追加し、/etc/ld.so.cache
を再作成すると、ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"
からの出力は
/usr/local/lib
/lib
/usr/lib
リストされたディレクトリが上から下に検索される順序が正しい場合、/lib
および/usr/lib
の前に追加のディレクトリが検索されるため、これは奇妙なことに気づきました。信頼できるディレクトリの前に追加のディレクトリが検索されること自体は奇妙ではありませんが、/lib
の前に/usr/lib
が検索されると、/bin
&/sbin
が検索されるため、それは奇妙ですPATH
の/usr/bin
&/usr/sbin
の後。
ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"
によってリストされたパスが下から上に検索されたとしても、/lib
は/usr/lib
の後に検索されますが、信頼できるディレクトリの後に追加のディレクトリが検索されるため、順序が歪んでいます。 。
では、ld.so
がライブラリのパスを検索する順序は何ですか? /lib
より前に/usr/lib
が検索されるのはなぜですか?そうでない場合、/lib
の後に追加のディレクトリが検索されるのはなぜですか?
順序は、ダイナミックリンカーのマニュアル ld.so
に記載されています。それは:
LD_LIBRARY_PATH
のディレクトリ/etc/ld.so.conf
のディレクトリ/lib
;/usr/lib
。(私は少し簡略化しています。詳細についてはマニュアルを参照してください。)
この順序は、デフォルトの場所にあるライブラリをカスタムライブラリでオーバーライドする唯一の方法であると考える場合に意味があります。 LD_LIBRARY_PATH
はユーザー設定です。他の設定よりも優先する必要があります。 /etc/ld.so.conf
はローカル設定であり、オペレーティングシステムのデフォルトの前にあります。したがって、ユーザーが別のバージョンのライブラリでプログラムを実行したい場合、その異なるライブラリバージョンの場所を含むLD_LIBRARY_PATH
でプログラムを実行できます。また、管理者として、/usr/local/lib
にライブラリの別のバージョンを配置し、/usr/local/lib
に/etc/ld.so.conf
をリストすることができます。
信頼はこれには入りません。すべてのライブラリがそこからロードされる可能性があるため、この検索パスにリストされているディレクトリは信頼されている必要があります。理論的には、システムで「より多くの信頼を必要とする」すべてのプログラムで使用されるライブラリ名をリストし、これらのすべてのライブラリが「最も信頼できる」ディレクトリに存在することを確認できます。 「信頼性が低い」プログラムを除いて、検索パス上のより信頼できるディレクトリの後にある場合に使用します。しかし、それは非常に壊れやすいでしょう。また、攻撃者がLD_LIBRARY_PATH
の値または/etc/ld.so.conf
の要素を挿入できる場合、PATH
の値を挿入するなど、任意のコードを実行するためのより直接的なルートが確実にあります。 LD_PRELOAD
など。ライブラリのロードパスでの信頼は、実行が信頼の境界を越える場合、つまり追加の特権(setuid/setgidプログラム、またはSudo
など)でプログラムを実行する場合に重要です。この場合、何が起きるかは、LD_LIBRARY_PATH
が空白になっていることです。
/lib
と/usr/lib
については、それほど重要ではありません。それらは同じエンティティ(オペレーティングシステム)によって提供され、両方に存在するライブラリがあってはなりません。 (非常に小さな)パフォーマンス上の利点を提供するため、最初に/lib
をリストすることは理にかなっています。最もよく使用されるライブラリー、特に小さな基本プログラムで使用されるライブラリー(ロード時間は実行全体の高い割合です)大規模で実行時間の長いプログラムよりも時間が長い)、/lib
にあります。