動的再配置を解決する際にシンボルルックアップの検索順序はどのようなものですか?ELF動的ローダシンボルの参照順序
共有ライブラリのシンボルを解決するときに、ローダーは最初に 'メイン実行可能ファイル'を検索します(メインの実行可能ファイルの上書きを許可する...)か、何ですか?
動的再配置を解決する際にシンボルルックアップの検索順序はどのようなものですか?ELF動的ローダシンボルの参照順序
共有ライブラリのシンボルを解決するときに、ローダーは最初に 'メイン実行可能ファイル'を検索します(メインの実行可能ファイルの上書きを許可する...)か、何ですか?
、各実行可能なオブジェクトは、独自の「検索範囲」を持っている:
LD_PRELOAD
機能を使用して追加された共有オブジェクトは、メインの実行可能ファイルの直後にグローバルルックアップスコープに追加されます。DF_SYMBOLIC
フラグが使用されている場合、そのオブジェクト内で発生したシンボル参照は、グローバルルックアップスコープで検索する前にオブジェクト内の定義を検索します。dlopen()
を使用して開いた共有オブジェクトには、独自の依存関係がある場合があります。 dlopen()
への呼び出し中にRTLD_GLOBAL
フラグが設定されていない場合、これらの依存関係はそのオブジェクトのルックアップスコープに追加されますが、グローバルルックアップスコープには影響しません。 RTLD_GLOBAL
フラグがdlopen()
に渡された場合、共有オブジェクト(およびその依存関係)は「グローバル」ルックアップスコープに追加され、後続のシンボルルックアップの動作が変更されます。Ulrich Drepperのガイド「How to Write Shared Libraries」がこのトピックで読むことをお勧めします。
共有ライブラリのシンボルを解決するときに、ローダーはまず「メイン実行可能ファイル」で検索します(メインの実行可能ファイルの上書きを許可する...)か、何ですか?
はい、正確です。ダイナミックローダには、ロードされたELFオブジェクトのリンクリスト(リストの先頭は_r_dynamic.r_map
)があり、探しているシンボル定義が見つかるまでそのリストのオブジェクトの動的シンボルテーブルを直線的に検索します。
リストの先頭は、常にメイン実行可能ファイルを指します。特定のシンボルがメインの実行可能ファイルからエクスポートされた場合、(ほぼ)常に "勝ち"(他の定義を上書き)します。
ただし、-Bsymbolic
リンカフラグはピクチャを少し変更します。私の理解パー
完全性のために:rdynamicオプション(または同様のもの)でコンパイルしない限り、ダイナミックシンボルテーブルにエクスポートされないメイン実行可能ファイルのシンボルがあります。 – debuti