RTLD(1)

名称
ld-elf.so.1, rtld - 実行時リンクエディタ

解説
ld-elf.so.1 は自己完結した共有オブジェクトで、 実行時にプロセスのアドレス空間に共有オブジェクトを読み込んで 編集する機能を提供します。 一般には動的リンカという名前でも知られています。 動的リンクされたプログラムに含まれるデータ構造を使って どの共有ライブラリが必要なのかを決定し、 mmap(2) システムコールを使ってそれらを読み込みます。

全ての共有ライブラリを読み込むことに成功すると、次に ld-elf.so.1 はメインプログラムおよび読み込んだ 全てのオブジェクトからの外部参照を解決します。 プログラム本体の実行が始まる前になんらかの設定をする機会を 共有オブジェクトに与えるために、 オブジェクトごとに初期化ルーチンを呼ぶ機構があります。 これは静的コンストラクタを含むような C++ ライブラリにとって有用です。

実行されるプログラムが動的にリンクされている場合には、そのプログラムと一緒に ld-elf.so.1 自体がカーネルによって読み込まれます。 そしてカーネルは動的リンカに制御を移します。 動的リンカがプログラムとそれに必要な共有オブジェクトの 読み込み、再配置、初期化を終えると、 プログラムのエントリポイントに制御を移します。

ファイルシステム中にある必要な共有オブジェクトを探索するために、 ld-elf.so.1 は ldconfig(8) ユーティリティによって用意される “hints” ファイルを使います。

ld-elf.so.1 は以下に挙げるような、 自身の動作を変えるために使用されるいくつかの環境変数を認識します:

LD_LIBRARY_PATH
    コロンで区切られたディレクトリのリストで、 共有ライブラリのデフォルトサーチパスを上書きします。 この環境変数は、 set-user-ID 及び set-group-ID されたプログラムにおいては無視されます。

LD_PRELOAD
    他の共有ライブラリより前にリンクされるべき共有ライブラリのリストで、 コロンか空白で区切られています。 もしディレクトリが指定されていないならば、 最初に LD_LIBRARY_PATH で指定されるディレクトリから、 続いて組み込みの標準ディレクトリ群から検索されます。 この環境変数は、 set-user-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_FMT1

LD_TRACE_LOADED_OBJECTS_FMT2
    設定されている場合には、 これらの変数は トレース出力をカスタマイズするための printf(3) 流フォーマット文字列として解釈されます。 ldd(1) の -f オプションがこれらを使用するので、 ldd(1) をより便利にフィルタとして使うことができます。 以下の変換を使うことができます:

    %a  メインプログラムの名前 (またの名を “__progname”) 。

    %A  LD_TRACE_LOADED_OBJECTS_PROGNAME 環境変数の値。

    %o  ライブラリの名前。

    %m  ライブラリのメジャーバージョン番号。

    %p  rtld のライブラリ検索ルールで決定されるフルパス名。

    %x  ライブラリのロードアドレス。

    さらに、 ‘\n’ と ‘\t’ が認識され、通常の意味をもちます。

関連ファイル

/var/run/ld-elf.so.hints

関連項目
ld(1), ldd(1), elf(5), ldconfig(8)