Scroll to navigation

LD.SO(8) Linux Programmer's Manual LD.SO(8)

名前

ld.so, ld-linux.so* - 動的なリンカ/ローダ

書式

動的リンカは、動的にリンクされたプログラムやライブラリの実行によって 間接的に実行することができる (ELF の場合、動的リンカにコマンドラインオプションを渡すことはできず、 プログラムの .interp セクションに入っている動的リンカが実行される)。 また以下のように直接実行することもできる

/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]

説明

プログラム ld.sold-linux.so* はプログラムに必要な共有ライブラリを見つけてロードし、 プログラムの実行を準備してから起動させる。

Linux のバイナリは、コンパイルの時に ld(1) に対して -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 を使用する。

プログラムで必要とされる共有ライブラリは、 以下の順序で検索される。

(ELF のみ) バイナリの動的セクション属性 DT_RPATH が存在し、 DT_RUNPATH 属性が存在しない場合は、 DT_RPATH で指定されたディレクトリを使用する。 DT_RPATH の使用は推奨されない。
環境変数 LD_LIBRARY_PATH を用いる。 ただし実行ファイルが set-user-ID/set-group-ID バイナリの場合、 これは無視される。
(ELF のみ) バイナリの動的セクション属性 DT_RUNPATH が存在すれば、 DT_RUNPATH で指定されたディレクトリを使用する。
キャッシュファイル /etc/ld.so.cache を探す。このファイルは、 (ld.so.conf で追加指定されたものも含めた) ライブラリ検索パスから 見つかったライブラリファイルの情報を集めたものである。 ただしバイナリがリンカオプション -z nodeflib でリンクされている場合は、デフォルトのライブラリパスにある ライブラリはスキップされる。
デフォルトパスである /lib、 次いで /usr/lib を用いる。 バイナリがリンカオプション -z nodeflib でリンクされている場合、このステップはスキップされる。

$ORIGIN と rpath

ld.so では、rpath 指定 (DT_RPATH や DT_RUNPATH) 中に $ORIGIN という文字列 (${ORIGIN} も等価) を使うことができる。 $ORIGIN はアプリケーションの実行ファイルが入っているディレクトリを表す。 これを使って somedir/app に置かれたアプリケーションを gcc -Wl,-rpath,'$ORIGIN/../lib' でコンパイルすると、 somedir がディレクトリ階層のどこにあっても、アプリケーションは somedir/lib にある対応する共有ライブラリを見つけることができる。 この機能を使うと、 特別なディレクトリではなく任意のディレクトリにインストールしても "ややこしい設定なしで" 独自の共有ライブラリを使えるアプリケーションを作成することができる。

オプション

全ての依存関係とその解決法をリストする。
プログラムが動的にリンクされているかと、 動的リンカがそのプログラムを扱えるかを検証する。
LD_LIBRARY_PATH 環境変数の設定を上書きする (下記参照)。
LIST にあるオブジェクト名の RPATH と RUNPATH の情報を無視する。 ld.so が set-user-ID か set-group-ID されている場合、 このオプションは無視される。

環境変数

4 つの重要な環境変数がある。

(libc5; glibc 2.1.1 以降) 空文字列でない場合、 動的リンカはプログラムの開始時に全てのシンボルを解決する。 空文字列の場合、解決しなければならない関数呼び出しが 最初に参照された時点で解決する。 デバッガを使っているときに役立つ。
コロン区切りのディレクトリリスト。 実行時に ELF ライブラリを検索するディレクトリを指定する。 PATH 環境変数と同じように指定する。
スペース区切りで ELF 共有ライブラリを指定する。 これはユーザーが指定でき、すべてのライブラリに先立ってロードされる。 他の共有ライブラリにある関数を選択的に置き換えるために用いることができる。 set-user-ID/set-group-ID された ELF バイナリに対して、 標準的な検索パスにあるライブラリのうち set-user-ID されているものはロードしない。
(ELF のみ) 空文字列でない場合、 プログラムを普通に実行するのではなく、 ldd(1) を実行したときのように動的ライブラリの依存関係をリスト表示させる。

そして、それほど知られていない環境変数もある。 多くは廃れてしまったものか内部でのみ使用される環境変数である。

(libc5) a.out バイナリにのみ使われる環境変数で、 LD_LIBRARY_PATH と同じ役割をする。 ld-linux.so.1 の古いバージョンでは LD_ELF_LIBRARY_PATH もサポートしていた。
(libc5) a.out バイナリにのみ使われる環境変数で、 LD_PRELOAD と同じ役割をする。 ld-linux.so.1 の古いバージョンでは LD_ELF_PRELOAD もサポートしていた。
(glibc 2.1.95 以降) シンボルを解決した後、GOT (global offset table) と PLT (procedure linkage table) を更新しない。
(glibc 2.1 以降) 動的リンカの詳細なデバッグ情報を出力する。 all に設定した場合、全ての動的リンカが持つデバッグ情報を表示する。 help に設定した場合、この環境変数で指定されるカテゴリのヘルプ情報を表示する。 glibc 2.3.4 以降、 set-user-ID/set-group-ID されたバイナリでは LD_DEBUG は無視される。
(glibc 2.1 以降) LD_DEBUG の出力を書き込むファイル。 デフォルトは標準出力である。 set-user-ID/set-group-ID されたバイナリでは、 LD_DEBUG_OUTPUT は無視される。
(glibc 2.1.19 以降) 上書きされる弱いシンボル (昔の glibc の挙動を逆にする)。 セキュリティ上の理由から、glibc 2.3.4 以降、 set-user-ID/set-group-ID されたバイナリでは LD_DYNAMIC_WEAK は無視される。
(glibc 2.1 以降) ハードウェア機能のマスク。
(a.out のみ)(libc5) ロードする a.out ライブラリの名前において、ディレクトリを無視しない。 このオプションは用いるべきではない。
(a.out のみ)(libc5) a.out ライブラリにおけるマイナーバージョン番号の非互換に 対する警告メッセージを抑制する。
(glibc 2.1 以降) バイナリへのパス (set-user-ID されていないプログラムについて)。 セキュリティ上の理由から、glibc 2.3.4 以降、 set-user-ID/set-group-ID されたバイナリでは LD_ORIGIN_PATH は無視される。
(glibc 2.1 以降) プロファイルを行う共有オブジェクト。 パス名か共有オブジェクト名 (soname) で指定される。 プロフィールの出力は "$LD_PROFILE_OUTPUT/$LD_PROFILE.profile" という名前の ファイルに書き込まれる。
(glibc 2.1 以降) LD_PROFILE の出力が書き込まれるディレクトリ。 この変数が定義されていないか、空の文字列が定義されている場合、 デフォルト値は /var/tmp となる。 set-user-ID/set-group-ID されたプログラムでは、 LD_PROFILE_OUTPUT は無視される。 出力ファイルは常に /var/profile が使用される。
(glibc 2.1 以降) カーネルから渡される補助的な (パラメータの) 配列を表示する。 セキュリティ上の理由から、glibc 2.3.4 以降、 set-user-ID/set-group-ID されたバイナリでは LD_SHOW_AUXV は無視される。
デフォルトでは (つまり、この変数が定義されていない場合)、 実行ファイルと prelink された共有オブジェクトでは、それらが依存する ライブラリのベースアドレスが尊重される一方、 (prelink されていない) position-independent executables (PIEs) と 他の共有オブジェクトでは依存するライブラリのベースアドレスは 尊重されない。 LD_USE_LOAD_BIAS に値が定義された場合、実行ファイルと PIE のどちらでも ベースアドレスが尊重される。 LD_USE_LOAD_BIAS が値 0 で定義された場合、実行ファイルと PIE のどちらでも ベースアドレスは尊重されない。 set-user-ID や set-group-ID されたプログラムでは、 この変数は無視される。
(glibc 2.1 以降) 空文字列でない場合に、 (LD_TRACE_LOADED_OBJECTS を設定するか、 --list または --verify オプションを動的リンカに指定することにより) プログラムについての情報を問い合わせると、 プログラムのシンボルバージョン情報を表示する。
(ELF のみ)(glibc 2.1.3 以降) 空文字列でない場合、解決されていないシンボルがあれば警告を出す。
(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 共有ライブラリを スペースで区切ったリストが書かれているファイル。
共有ライブラリ

注意

ld.so の機能は libc のバージョン 4.4.3 以上を用いてコンパイルされた 実行ファイルで使用可能である。 ELF の機能は Linux 1.1.52 以降と libc5 以降で使用可能である。

関連項目

ldd(1), ldconfig(8)

2008-10-27 GNU