LD_LIBRARY_PATH 覚書

LD_LIBRARY_PATHはLinuxのダイナミックリンカーであるld-linux.soが共有ライブラリを探すためのパスを設定した環境変数。

プログラムが起動したとき、まずld-linux.soが読み込まれ、これが必要な共有ライブラリを探してリンクする。その後プログラムが実行される。

ld-linux.soはまず環境変数LD_LIBRARY_PATHから探す。ただし、 setuid/setgidされているプログラムは除外される。

次に、/etc/ld.so.cacheから探す。これはバイナリファイル。速い。

最後に、/usr/lib, /libから探す。

/etc/ld.so.cache/sbin/ldconfigによってつくられる。ldconfigはライブラリのシンボリックリンクも作成する。ldconfigは/etc/ld.so.confファイルに記述してあるディレクトリに対して操作を行う。

LD_PRELOADに共有ライブラリのパスが書かれていると、ld-linux.soはまずこれらのライブラリを優先させる。これによりプログラム中のある関数だけをフックすることができる。

あるプログラムがどの共有ライブラリを使うかは、lddコマンドで確認できる。
プログラムが本当にld-linux.soを使っているかは readelf -l /bin/date で確認できる。

LD_DEBUG環境変数を使用すると、プログラムがダイナミックリンクするときのさまざまな情報を表示できる。

/etc/ld.so.nohwcapが存在すれば、ld-linux.soは最適化されていないライブラリを使う。

ある実行ファイルがどのダイナミックリンカーを使っているかは以下のように調べる。

ライブラリや実行ファイルのファイル形式はa.outとELFがあるが、上記の説明はすべてELFに関するもの。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)