RTLD(1) | FreeBSD General Commands Manual | RTLD(1) |
名称
ld-elf.so.1, ld.so, rtld — 実行時リンクエディタ解説
ld-elf.so.1 ユーティリティは、自己完結した共有オブジェクトで、実行時にプロセスのアドレス空間に共有オブジェクトを読み込んで編集する機能を提供します。一般には、動的リンカという名前でも知られています。動的リンクされたプログラムに含まれるデータ構造を使ってどの共有ライブラリが必要なのかを決定し、 mmap(2) システムコールを使ってそれらを読み込みます。全ての共有ライブラリを読み込むことに成功すると、次に ld-elf.so.1 は、メインプログラムおよび読み込んだ全てのオブジェクトからの外部参照を解決します。プログラム本体の実行が始まる前になんらかの設定をする機会を共有オブジェクトに与えるために、オブジェクトごとに初期化ルーチンを呼ぶ機構があります。これは、静的コンストラクタを含むような C++ ライブラリにとって有用です。
ロードされたオブジェクトのための依存を解決するとき、 ld-elf.so.1 は、静的なリンカ ld(1) の -z origin オプションを設定することによって、rpath と soname のダイナミックなトークン文字列を変換することができるようになります。次の文字列が現在、認識されます:
- $ORIGIN
- ロードされたオブジェクトのフルパスに変換されます。
- $OSNAME
- オペレーティングシステム実装の名前に変換されます。
- $OSREL
- オペレーティングシステムのリリースレベルに変換されます。
- $PLATFORM
- マシンハードウェアプラットフォームに変換されます。
実行されるプログラムが動的にリンクされている場合には、そのプログラムと一緒に ld-elf.so.1 ユーティリティ自体がカーネルによって読み込まれます。そしてカーネルは、動的リンカに制御を移します。動的リンカがプログラムとそれに必要な共有オブジェクトの読み込み、再配置、初期化を終えると、プログラムのエントリポイントに制御を移します。次の検索順序は、必要な共有オブジェクトを見つけるために使用されます:
- そのオブジェクトも DT_RUNPATH タグを含んでいないなら、参照するオブジェクトの DT_RPATH
- 参照するオブジェクトが DT_RUNPATH タグを含んでいなければ、プログラムの DT_RPATH
- LD_LIBRARY_PATH 環境変数によって示されるパス
- 参照するオブジェクトの DT_RUNPATH
- ldconfig(8) ユーティリティによって生成されたヒントファイル
- 参照されるオブジェクトが“ -z nodefaultlib”オプションを使用して、リンクされなかったなら、 /lib と /usr/lib ディレクトリ。
ld-elf.so.1 ユーティリティは、その振る舞いを修正するために使用することができる多くの環境変数を認識します。 64 ビットアーキテクチャでは、32 ビットのオブジェクトのためのリンカは、以下にリストされたすべての環境変数を認識しますが、 LD_32_ が前に付けられています、例えば: LD_32_TRACE_LOADED_OBJECTS。
- LD_DUMP_REL_POST
- 設定されるならシンボル束縛と再配置の後に、 ld-elf.so.1 は、全再配置を含む表を表示します。
- LD_DUMP_REL_PRE
- 設定されるなら、シンボル束縛と再配置の前に、 ld-elf.so.1 は、全再配置を含む表を表示します。
- LD_LIBMAP
-
ライブラリ置換リストで、形式は、
libmap.conf(5) と同じです。便利なように、空白と改行のかわりに‘
=
’と‘,
’の文字を使うことができます。この変数は、 libmap.conf(5) の後に解析され、このファイルで指定された項目を上書きします。この変数は、セットユーザ ID (set-user-ID) とセットグループ ID (set-group-ID) プログラムのために未設定とされます。 - LD_LIBMAP_DISABLE
- 設定されるなら、 libmap.conf(5) と LD_LIBMAP の使用を無効とします。この変数は、セットユーザ ID (set-user-ID) とセットグループ ID (set-group-ID) プログラムに対して未設定とされます。
- LD_ELF_HINTS_PATH
- この変数は、“hints”ファイルのデフォルト位置を上書きします。この変数は、セットユーザ ID (set-user-ID) とセットグループ ID (set-group-ID) プログラムのために未設定とされます。
- LD_LIBRARY_PATH
- コロンで区切られたディレクトリのリストで、共有ライブラリのデフォルトサーチパスを上書きします。この変数は、セットユーザ ID (set-user-ID) とセットグループ ID (set-group-ID) プログラムのために未設定とされます。
- LD_LIBRARY_PATH_RPATH
- 変数が指定され、´y´、´Y´または´1´シンボルのいずれかで始まる値があるなら、 LD_LIBRARY_PATH 変数によって指定されたパスは、 DT_RUNPATH タグを含んでいないバイナリのための DT_RPATH からのパスを無視することができます。そのようなバイナリに関して、変数 LD_LIBRARY_PATH_RPATH が設定されるとき、“ -z nodefaultlib”のリンク時オプションは、同様に無視されます。
- LD_PRELOAD
- 他の共有ライブラリより前にリンクされるべき共有ライブラリのリストで、コロンか空白で区切られています。もしディレクトリが指定されていないならば、最初に LD_LIBRARY_PATH で指定されるディレクトリから、続いて組み込みの標準ディレクトリ群から検索されます。この変数は、セットユーザ ID (set-user-ID) とセットグループ ID (set-group-ID) プログラムのために未設定とされます。
- LD_BIND_NOW
- 空ではない文字列が設定されている場合には、 ld-elf.so.1 は、全ての外部関数呼び出しをプログラムの実行を始める前に再配置します。通常、関数呼び出しの結合は、遅延方式 (lazy binding) で行われます。すなわち、関数呼び出しは、それぞれの関数が最初に呼ばれる時に結合されます。 LD_BIND_NOW は、プログラムの起動時間を増加させますが、実行時に思いもかけず関数が定義されていなかったという事件は避けられます。
- LD_TRACE_LOADED_OBJECTS
- 空ではない文字列が設定されている場合には、 ld-elf.so.1 は、共有オブジェクトを読み込んで、全てのオブジェクトの絶対パス名を含む概要を標準出力に表示した後に終了します。
- LD_TRACE_LOADED_OBJECTS_ALL
- 空ではない文字列に設定されている場合には、どのオブジェクトがどのオブジェクトのロードの原因となったのかというまとめを ld-elf.so.1 が展開するようにさせます。
- LD_TRACE_LOADED_OBJECTS_FMT1
- LD_TRACE_LOADED_OBJECTS_FMT2
-
設定されるなら、これらの変数は、トレース出力をカスタマイズするための
printf(3) 流フォーマット文字列として解釈されます。
ldd(1) の
-f オプションがこれらを使用するので、
ldd(1) をより便利にフィルタとして使うことができます。依存する名前が文字列
lib で始まるなら、
LD_TRACE_LOADED_OBJECTS_FMT1 が使用されます、そうでなければ
LD_TRACE_LOADED_OBJECTS_FMT2 が使用されます。以下の変換を使うことができます:
-
%a
- メインプログラムの名前 (またの名を“__progname)”。
-
%A
- LD_TRACE_LOADED_OBJECTS_PROGNAME 環境変数の値。通常、 ldd(1) を使用して検査されるプログラムの名前と共有ライブラリの両方を印刷 (表示) するために使用されます。
-
%o
- ライブラリの名前。
-
%p
- rtld のライブラリ検索ルールで決定されるフルパス名。
-
%x
- ライブラリのロードアドレス。
さらに、‘
\n
’と‘\t
’が認識され、通常の意味をもちます。 -
- LD_UTRACE
- 設定されるなら、 ld-elf.so.1 は、 utrace(2) を通して共有オブジェクトのロードとアンロードのようなイベントをログ登録します。
- LD_LOADFLTR
- 設定されるなら、 ld-elf.so.1 は、必要になるまで、それを延期することの代わりに直ちにロードされたオブジェクトの filtee の依存を処理します。通常、filtee は、フィルタオブジェクトから最初のシンボルの解決時点で、オープンされます。
関連ファイル
- /var/run/ld-elf.so.hints
- ヒントファイル。
- /var/run/ld-elf32.so.hints
- 64 ビットシステムでの 32 ビットバイナリのためのヒントファイル。
- /etc/libmap.conf
- libmap の設定ファイル。
- /etc/libmap32.conf
- 64 ビットシステムでも 32 ビットバイナリのための libmap 設定ファイル。
June 28, 2012 | FreeBSD |