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環境変数を使用すると、プログラムがダイナミックリンクするときのさまざまな情報を表示できる。
1 |
$ LD_DEBUG=all date |
/etc/ld.so.nohwcapが存在すれば、ld-linux.soは最適化されていないライブラリを使う。
ある実行ファイルがどのダイナミックリンカーを使っているかは以下のように調べる。
1 |
$ readelf -l xxx | grep interpreter |
ライブラリや実行ファイルのファイル形式はa.outとELFがあるが、上記の説明はすべてELFに関するもの。