動的再配置を解決するときのシンボル検索の検索順序は何ですか?
共有ライブラリのシンボルを解決するとき、ローダーは最初に「メイン実行可能ファイル」を検索します(メイン実行可能ファイルが定義をオーバーライドできるようにするため...)、または何ですか?
私の理解では、各実行可能オブジェクトには独自の「ルックアップスコープ」があります。
LD_PRELOAD
、メインの実行可能ファイルの直後に、グローバル ルックアップ スコープに追加されます。DF_SYMBOLIC
フラグを使用している場合、そのオブジェクト内で発生したシンボル参照は、グローバル ルックアップ スコープで検索する前に、オブジェクト内の定義を検索します。dlopen()
は、独自の依存関係がある場合があります。RTLD_GLOBAL
への呼び出し中にフラグが設定されなかった場合dlopen()
、これらの依存関係はそのオブジェクトのルックアップ スコープに追加されますが、グローバル ルックアップ スコープには影響しません。RTLD_GLOBAL
フラグが に渡された場合dlopen()
、共有オブジェクト (およびその依存関係) が「グローバル」ルックアップ スコープに追加され、後続のシンボル ルックアップの動作が変更されます。このトピックについては、 Ulrich Drepper のガイド「共有ライブラリの作成方法」を読むことをお勧めします。
共有ライブラリのシンボルを解決するとき、ローダーは最初に「メイン実行可能ファイル」を検索します(メイン実行可能ファイルが定義をオーバーライドできるようにするため...)、または何ですか?
はい、正確に。動的ローダーには、ロードされた ELF オブジェクトのリンクされたリスト (リストの先頭は_r_dynamic.r_map
) があり、探しているシンボル定義が見つかるまで、そのリスト内のオブジェクトの動的シンボル テーブルを直線的に検索します。
リストの先頭は常にメインの実行可能ファイルを指します。特定のシンボルがメインの実行可能ファイルからエクスポートされた場合、それは (ほとんど) 常に「勝利」します (他の定義をオーバーライドします)。
ただし、-Bsymbolic
リンカー フラグによって画像が少し変わることに注意してください。