名前
ld.so, ld-linux.so* - 動的なリンカ・ローダ
書式
動的リンカは、動的にリンクされたプログラムやライブラリの実行によって 間接的に実行することができる (ELF の場合、動的リンカにコマンドラインオプションを渡すことはできず、 プログラムの .interp セクションに入っている動的リンカが実行される)。 また以下のように直接実行することもできる
/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]
説明
プログラム ld.so と ld-linux.so* はプログラムに必要な共有ライブラリを見つけてロードし、 プログラムの実行を準備してから起動させる。
Linux のバイナリは、コンパイルの時に ld に対して -static オプションが指定されていない限り、動的リンク (実行時リンク) が必要となる。
プログラム ld.so は a.out バイナリを扱う。 これはずっと昔に使われていたフォーマットである。 ld-linux.so* (libc5 では /lib/ld-linux.so.1, glibc2 では /lib/ld-linux.so.2) は ELF バイナリを扱う。 このフォーマットは多くの人が最近何年も使っている。 それ以外の点では両方とも同じように動作し、 同じサポートファイルとプログラム ldd(1), ldconfig(8), /etc/ld.so.conf を使用する。
プログラムで必要とされる共有ライブラリは、 いろいろな場所から検索される。
o | (ELF のみ) バイナリの動的セクション属性 DT_RPATH が存在し、 DT_RUNPATH 属性が存在しない場合は、DT_RPATH を用いる。 DT_RPATH の使用は推奨されない。 |
o | 環境変数 LD_LIBRARY_PATH を用いる。 ただし実行ファイルが set-user-ID/set-group-ID バイナリの場合、 これは無視される。 |
o | (ELF のみ) バイナリの動的セクション属性 DT_RUNPATH を用いる (存在する場合) 。 |
o | キャッシュファイル /etc/ld.so.cache を探す。このファイルは、 (ld.so.conf で追加指定されたものも含めた) ライブラリ検索パスから 見つかったライブラリファイルの情報を集めたものである。 ただしバイナリがリンカオプション -z nodeflib でリンクされている場合は、デフォルトのライブラリパスにある ライブラリはスキップされる。 |
o | デフォルトパスである /lib、 次いで /usr/lib を用いる。 バイナリがリンカオプション -z nodeflib でリンクされている場合、このステップはスキップされる。 |
オプション
--list | 全ての依存関係とその解決法をリストする。 |
--verify | |
プログラムが動的にリンクされているかと、 動的リンカがそのプログラムを扱えるかを検証する。 | |
--library-path PATH | |
LD_LIBRARY_PATH 環境変数の設定を上書きする (下記参照)。 | |
--ignore-rpath LIST | |
LIST にあるオブジェクト名の RPATH と RUNPATH の情報を無視する。 このオプションは glibc では 1 時間ほどサポートされていたが、 以下の名前に変更された。 | |
--inhibit-rpath LIST | |
環境変数
4 つの重要な環境変数がある。
LD_LIBRARY_PATH | |
コロン区切りのディレクトリリスト。 実行時に ELF ライブラリを検索するディレクトリを指定する。 PATH 環境変数と同じように指定する。 | |
LD_PRELOAD | |
スペース区切りで ELF 共有ライブラリを指定する。 これはユーザーが指定でき、すべてのライブラリに先立ってロードされる。 他の共有ライブラリにある関数を選択的に置き換えるために用いることができる。 set-user-ID/set-group-ID された ELF バイナリに対して、 標準的な検索パスにあるライブラリのうち set-user-ID されているものはロードしない。 | |
LD_BIND_NOW | |
(libc5; glibc 2.1.1 以降) 空文字列でない場合、 動的リンカはプログラムの開始時に全てのシンボルを解決する。 空文字列の場合、解決しなければならない関数呼び出しが 最初に参照された時点で解決する。 デバッガを使っているときに役立つ。 | |
LD_TRACE_LOADED_OBJECTS | |
(ELF のみ) 空文字列でない場合、 プログラムを普通に実行するのではなく、 ldd(1) を実行したときのように動的ライブラリの依存関係をリスト表示させる。 | |
そして、それほど知られていない環境変数もある。 多くは廃れてしまったものか内部でのみ使用される環境変数である。 | |
LD_WARN | |
(ELF のみ)(glibc 2.1.3 以降) 空文字列でない場合、解決されていないシンボルがあれば警告を出す。 | |
LD_NOWARN | |
(a.out のみ)(libc5) a.out ライブラリにおけるマイナーバージョン番号の非互換に 対する警告メッセージを抑制する。 | |
LD_BIND_NOT | |
(glibc 2.1.95 以降) シンボルを解決した後、GOT (global offset table) と PLT (procedure linkage table) を更新しない。 | |
LD_DEBUG | |
(glibc 2.1 以降) 動的リンカの詳細なデバッグ情報を出力する。 all に設定した場合、全ての動的リンカが持つデバッグ情報を表示する。 help に設定した場合、この環境変数で指定されるカテゴリのヘルプ情報を表示する。 | |
LD_DEBUG_OUTPUT | |
(glibc 2.1 以降) LD_DEBUG の出力を書き込むファイル。 デフォルトは標準出力である。 set-user-ID/set-group-ID されたバイナリでは、 LD_DEBUG_OUTPUT は無視される。 | |
LD_VERBOSE | |
(glibc 2.1 以降) 空文字列でない場合に、 (LD_TRACE_LOADED_OBJECTS を設定するか、 --list または --verify オプションを動的リンカに指定することにより) プログラムについての情報を問い合わせると、 プログラムのシンボルバージョン情報を表示する。 | |
LD_PROFILE | |
(glibc 2.1 以降) プロファイルを行う共有オブジェクト。 | |
LD_PROFILE_OUTPUT | |
(glibc 2.1 以降) LD_PROFILE の出力を書き込むファイル。 デフォルトは標準出力である。 set-user-ID/set-group-ID されたバイナリでは、 LD_PROFILE_OUTPUT は無視される。 | |
LD_AOUT_LIBRARY_PATH | |
(libc5) a.out バイナリにのみ使われる環境変数で、 LD_LIBRARY_PATH と同じ役割をする。 ld-linux.so.1 の古いバージョンでは LD_ELF_LIBRARY_PATH もサポートしていた。 | |
LD_AOUT_PRELOAD | |
(libc5) a.out バイナリにのみ使われる環境変数で、 LD_PRELOAD と同じ役割をする。 ld-linux.so.1 の古いバージョンでは LD_ELF_PRELOAD もサポートしていた。 | |
LD_SHOW_AUXV | |
(glibc 2.1 以降) カーネルから渡される補助的な (パラメータの) 配列を表示する。 | |
LD_HWCAP_MASK | |
(glibc 2.1 以降) ハードウェア機能のマスク。 | |
LD_ORIGIN_PATH | |
(glibc 2.1 以降) バイナリへのパス (set-user-ID されていないプログラムについて)。 | |
LD_DYNAMIC_WEAK | |
(glibc 2.1.19 以降) 上書きされる弱いシンボル (昔の glibc の挙動を逆にする)。 | |
LD_KEEPDIR | |
(a.out のみ)(libc5) ロードする a.out ライブラリの名前において、ディレクトリを無視しない。 このオプションは用いるべきではない。 | |
LDD_ARGV0 | |
(libc5) ldd(1) の引き数がない場合に、 argv[0] として使われる値。 | |
ファイル
/lib/ld.so | |
a.out の動的リンカ/ローダ | |
/lib/ld-linux.so.{1,2} | |
ELF の動的リンカ/ローダ | |
/etc/ld.so.cache | |
ライブラリを検索するディレクトリを集めたリストと、 共有ライブラリの候補の整列リストを含むファイル。 | |
/etc/ld.so.preload | |
プログラムの前にロードすべき ELF 共有ライブラリを スペースで区切ったリストが書かれているファイル。 | |
lib*.so* | |
共有ライブラリ | |
注意
ld.so の機能は libc のバージョン 4.4.3 以上を用いてコンパイルされた 実行ファイルで使用可能である。 ELF の機能は Linux 1.1.52 以降と libc5 以降で使用可能である。