8

動的再配置を解決するときのシンボル検索の検索順序は何ですか?

共有ライブラリのシンボルを解決するとき、ローダーは最初に「メイン実行可能ファイル」を検索します(メイン実行可能ファイルが定義をオーバーライドできるようにするため...)、または何ですか?

4

2 に答える 2

11

私の理解では、各実行可能オブジェクトには独自の「ルックアップスコープ」があります。

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

このトピックについては、 Ulrich Drepper のガイド「共有ライブラリの作成方法」を読むことをお勧めします。

于 2012-10-01T04:17:07.703 に答える
4

共有ライブラリのシンボルを解決するとき、ローダーは最初に「メイン実行可能ファイル」を検索します(メイン実行可能ファイルが定義をオーバーライドできるようにするため...)、または何ですか?

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

リストの先頭は常にメインの実行可能ファイルを指します。特定のシンボルがメインの実行可能ファイルからエクスポートされた場合、それは (ほとんど) 常に「勝利」します (他の定義をオーバーライドします)。

ただし、-Bsymbolicリンカー フラグによって画像が少し変わることに注意してください。

于 2012-10-01T03:19:49.093 に答える