2012-10-01 9 views
8

動的再配置を解決する際にシンボルルックアップの検索順序はどのようなものですか?ELF動的ローダシンボルの参照順序

共有ライブラリのシンボルを解決するときに、ローダーは最初に 'メイン実行可能ファイル'を検索します(メインの実行可能ファイルの上書きを許可する...)か、何ですか?

答えて

9

、各実行可能なオブジェクトは、独自の「検索範囲」を持っている:

  • メインの実行ファイルは、通常、「グローバル」検索範囲の最初のオブジェクトです。つまり、メインの実行可能ファイルで定義されたシンボルは、依存する共有ライブラリのシンボルよりも優先されます。 LD_PRELOAD機能を使用して追加された共有オブジェクトは、メインの実行可能ファイルの直後にグローバルルックアップスコープに追加されます。
  • ただし、ロードされる共有オブジェクトにDF_SYMBOLICフラグが使用されている場合、そのオブジェクト内で発生したシンボル参照は、グローバルルックアップスコープで検索する前にオブジェクト内の定義を検索します。
  • dlopen()を使用して開いた共有オブジェクトには、独自の依存関係がある場合があります。 dlopen()への呼び出し中にRTLD_GLOBALフラグが設定されていない場合、これらの依存関係はそのオブジェクトのルックアップスコープに追加されますが、グローバルルックアップスコープには影響しません。 RTLD_GLOBALフラグがdlopen()に渡された場合、共有オブジェクト(およびその依存関係)は「グローバル」ルックアップスコープに追加され、後続のシンボルルックアップの動作が変更されます。

Ulrich Drepperのガイド「How to Write Shared Libraries」がこのトピックで読むことをお勧めします。

+0

完全性のために:rdynamicオプション(または同様のもの)でコンパイルしない限り、ダイナミックシンボルテーブルにエクスポートされないメイン実行可能ファイルのシンボルがあります。 – debuti

4

共有ライブラリのシンボルを解決するときに、ローダーはまず「メイン実行可能ファイル」で検索します(メインの実行可能ファイルの上書きを許可する...)か、何ですか?

はい、正確です。ダイナミックローダには、ロードされたELFオブジェクトのリンクリスト(リストの先頭は_r_dynamic.r_map)があり、探しているシンボル定義が見つかるまでそのリストのオブジェクトの動的シンボルテーブルを直線的に検索します。

リストの先頭は、常にメイン実行可能ファイルを指します。特定のシンボルがメインの実行可能ファイルからエクスポートされた場合、(ほぼ)常に "勝ち"(他の定義を上書き)します。

ただし、-Bsymbolicリンカフラグはピクチャを少し変更します。私の理解パー

関連する問題