9

ローダーが DLL をプロセス アドレス空間にマップする方法を知りたいです。ローダーがその魔法をどのように行うか。例は高く評価されています。

前もって感謝します。

4

4 に答える 4

9

さて、ここでは Windows 側を想定しています。PE ファイルをロードすると、ローダー (NTDLL に含まれる) が次のことを行います。

  1. DLL 検索セマンティクス (システムおよびパッチ レベル固有) を使用して各 DLL を見つけます。よく知られている DLL は、この対象から除外されます。
  2. ファイルをメモリ (MMF) にマップします。ページはコピー オン ライト (CoW) です。
  3. インポート ディレクトリをトラバースし、ポイント 1 から (再帰的に) インポートを開始します。
  4. コード自体が位置独立コード (PIC) であるため、ほとんどの場合、非常に限られた数のエンティティのみである再配置を解決します。
  5. (IIRC) EAT を RVA (相対仮想アドレス) から VA (現在のプロセス メモリ空間内の仮想アドレス) にパッチします。
  6. IAT (インポート アドレス テーブル) にパッチを適用して、プロセス メモリ空間内の実際のアドレスでインポートを参照します。
  7. EXEの DLL 呼び出しDLLMain()の場合、開始アドレスが PE ファイルのエントリ ポイントにあるスレッドを作成します (実際の開始アドレスは Win32 プロセスの kernel32.dll 内にあるため、これも単純化されすぎています)。

コードをコンパイルすると、外部関数がどのように参照されるかはリンカに依存します。一部のリンカーはスタブを作成するため、理論的には、NULL に対して関数アドレスをチェックしようとすると、常に NULL ではないと判断されます。これは、リンカーが影響を受けるかどうか、いつ影響を受けるかを認識しておく必要がある癖です。その他は IAT エントリを直接参照します。この場合、参照されていない関数 (遅延ロードされた DLL を考えてください) のアドレスは NULL になる可能性があり、SEH ハンドラーは遅延ロード ヘルパーを呼び出し、関数アドレスを解決 (しようと) してから、実行を再開します。失敗した点。

上記のプロセスには、単純化しすぎた多くの事務処理が含まれています。

あなたが知りたかったことの要点は、プロセスへのマッピングが MMF として発生するということですが、ヒープスペースで動作を人為的に模倣することができます。ただし、CoW に関する要点を覚えていれば、それが DLL の考え方の核心です。実際には、DLL の (ほとんどの) ページの同じコピーが、特定の DLL をロードするプロセス間で共有されます。共有されていないページは、たとえば、移転や同様のことを解決するときに、私たちが書いたページです。この場合、各プロセスには元のページのコピー (現在は変更されています) があります。

そして、DLL 上の EXE パッカーに関する警告です。DLL がロードされるプロセスのヒープ上に、DLL のアンパックされたコンテンツ用のスペースを割り当てるという点で、私が説明したこの CoW メカニズムを正確に無効にします。そのため、実際のファイルの内容は引き続き MMF としてマップされ、共有されますが、展開された内容は、DLL をロードするプロセスごとに、それを共有する代わりに同じ量のメモリを占有します。

于 2011-06-16T17:08:01.980 に答える
8

どのレベルの詳細を探していますか?基本的なレベルでは、すべてのダイナミックリンカーはほぼ同じように機能します。

  1. ダイナミックライブラリは、再配置可能なコードにコンパイルされます(たとえば、絶対ではなく相対ジャンプを使用します)。
  2. リンカは、アプリケーションのメモリマップで適切なサイズの空のスペースを見つけ、DLLのコードと静的データをそのスペースに読み込みます。
  3. ダイナミックライブラリには、エクスポートされた各関数の先頭へのオフセットのテーブルが含まれ、クライアントプログラムでのDLLの関数の呼び出しは、ライブラリがロードされた場所に基づいて、ロード時に新しい宛先アドレスでパッチが適用されます。
  4. ほとんどのダイナミックリンカーシステムには、特定のライブラリの優先ベースアドレスを設定するためのシステムがあります。ライブラリが優先アドレスにロードされている場合は、手順2と3の再配置をスキップできます。
于 2008-12-03T12:07:53.780 に答える
3

本当に興味がある場合は、本Linkers and Loadersを読む必要があります。

于 2008-12-03T12:22:27.900 に答える
2

これがWindowsにあると仮定すると(DLLはそれを示唆しています)、Microsoftのランタイムダイナミックリンクのドキュメントページを読むことをお勧めします。DLLがアドレス空間にどのようにマップされるかについては詳細に指定されていません。私はあなたがそれを知る必要はないはずだと思います。

于 2008-12-03T11:50:04.487 に答える