Dllは本質的にExeと同じであるため、リンクプロセスの一部として生成するかを選択することは、どちらかから関数とデータをエクスポートすることが可能であるため、わかりやすくするためである。
オペレーティングシステムがエントリポイントを介してそれをロードするためにEXEを必要とするため、DLLを直接実行することはできません。RUNDLLのようなユーティリティが存在します。EXEまたはRUNDLL32.多くのサポートなしで実行するのに十分な機能を含むDllのエントリポイントと最小限のフレームワークを提供するEXE。,
Dllは、共有コードとデータのメカニズムを提供し、共有コード/データの開発者は、アプリケーションを再リンクまたは再コンパイルする必要なしに機能をアップグレードできるようにします。 アプリケーション開発の観点から、WindowsとOS/2はアップグレードされたDllのコレクションと考えることができ、OSベンダーがインターフェイスと機能が互換性,
Dllは、呼び出し元のプロセスのメモリ空間で同じアクセス許可で実行されるため、使用にオーバーヘッドはほとんどありませんが、DLLにバグがある場合
メモリ管理編集
Windows APIでは、DLLファイルはセクションに編成されています。 各セクションには、書き込み可能または読み取り専用、実行可能(コードの場合)または非実行可能(データの場合)など、独自の属性セットがあります。,
DLL内のコードは、通常、DLLを使用するすべてのプロセス間で共有されます。 代わりに、コードがロードされると再配置され、DLLをロードする最初のプロセスのメモリ空間に空いている場所にあるすべてのエントリポイントのアドレ, すべての実行中のプロセスが単一の共通アドレス空間を占有していた古いバージョンのWindowsでは、DLLのコードの単一のコピーは常にすべてのプロセスに ただし、各プログラムに別々のアドレススペースを使用する新しいバージョンのWindowsでは、各プログラムにDLLのコードを収容できる同じ仮想アドレスがある場, いくつかのプログラム(または既にロードされたDllの組み合わせ)にこれらのアドレスが空いていない場合は、別の再配置されたエントリポイントのセットを使用して、DLLのコードの追加の物理コピーを作成する必要があります。 コードセクションによって占有されている物理メモリを再利用する場合、その内容は破棄され、後で必要に応じてDLLファイルから直接再ロードされます。
コードセクションとは対照的に、DLLのデータセクションは通常プライベートであり、DLLを使用する各プロセスには、すべてのDLLデータの独自のコピーがあります。, オプションとして、データ部門で共有可能なプロセス間通信によるこの共有メモリです。 つまり、あるプロセスが共有データを破損する可能性があり、他のすべての共有プロセスが望ましくない動作を引き起こす可能性があります。 例えば、プロセスの下では、ゲストアカウントでこのよう腐敗した別のプロセス動特ます。 これは、Dllで共有セクションを使用しないための重要な理由です。,
DLLが特定の実行可能パッカー(UPXなど)によって圧縮されている場合、そのすべてのコードセクションは読み取りおよび書き込みとしてマークされ、共有 読み取りと書き込みのコードセクションは、プライベートデータセクションと同様に、各プロセス したがって、共有データセクションを持つDllは、複数のプログラムによって同時に使用されることを意図している場合は、各プログラムインスタンスが
Import librariesEdit
静的ライブラリと同様に、Dllのインポートライブラリはによって注意されます。,ファイル拡張子lib. たとえば、kernel32です。dllは、ファイル作成やメモリ管理などのWindowsの基本的な機能のための主要な動的ライブラリであり、kernel32を介してリンクされています。リブ 適切な静的ライブラリからインポートライブラリを伝える通常の方法は、サイズによってです:インポートライブラリは、リンク時に処理される実際のDLL どちらもUnix ar形式のファイルです。
リンクダイナミックな図書館は、通常の取扱いへのリンクはインポート図書館がビルへのリンクを作成し実行可能ファイルです。, 作成された実行可能ファイルには、すべてのDLL関数呼び出しが参照されるインポートアドレステーブル(IAT)が含まれています(参照される各DLL関数にはIAT 実行時に、iatには、個別にロードされたDLL内の関数を直接指す適切なアドレスが入力されます。
Cygwin/MSYSおよびMinGWでは、インポートライブラリには通常、windows DLLサフィックスとUnix arサフィックスの両方を組み合わせたサフィックス.dll.a
が与えられます。, ファイル形式は似ていますが、インポートをマークするために使用されるシンボルは異なります(_head_foo_dllと__IMPORT_DESCRIPTOR_foo)。 GNU Binutilsツールチェーンはインポートライブラリを生成してそれらにリンクすることができますが、DLLに直接リンクする方が高速です。 MinGWのgenlibと呼ばれる実験的なツールを使用して、MSVCスタイルのシンボルを使用してインポートlibを生成できます。
シンボル解決とバインディング編集
DLLによってエクスポートされる各関数は、数値の序数とオプションで名前で識別されます。 同様に、関数は、序数または名前のいずれかでDLLからインポートすることができます。, 序数は、DLLエクスポートアドレステーブル内の関数のアドレスポインターの位置を表します。 内部関数は序数によってのみエクスポートされるのが一般的です。 ほとんどのWindows API関数では、異なるWindowsリリース間で名前のみが保持されます。 したがって、windows API関数を序数で確実にインポートすることはできません。
序数による関数のインポートは、名前による関数のインポートよりもわずかに優れたパフォーマンスを提供します。dllのエクスポートテーブルは名前によって, 見つかった名前のインデックスは、エクスポート序数テーブル内の序数を検索するために使用されます。 16ビットWindowsでは、名前テーブルはソートされていなかったため、名前検索のオーバーヘッドがはるかに顕著でした。
実行可能ファイルをDLLの特定のバージョンにバインドすること、つまり、コンパイル時にインポートされた関数のアドレスを解決することもできます。 のために行き、輸入のリンカーを保存するタイムスタンプをチェックサムのDLLのインポートが行します。 実行時に、Windowsは同じバージョンのライブラリが使用されているかどうかを確認し、使用されている場合、Windowsはインポートの処理をバイパスします。, それ以外の場合、ライブラリがバインドされたライブラリと異なる場合、Windowsは通常の方法でインポートを処理します。
バインドされた実行可能ファイルは、コンパイルされたのと同じ環境で実行される場合はやや高速にロードされ、別の環境で実行される場合はまったく同じ時間にロードされるため、インポートをバインドするための欠点はありません。 例えば、すべての標準のWindowsアプリケーションは、システムが大幅に向上し、それぞれの窓です。 アプリケーションのインポートをターゲット環境にバインドする良い機会は、アプリケーションのイ, これにより、次のOS更新までライブラリが”バインド”されます。 ただし、実行可能ファイルのチェックサムを変更するため、署名されたプログラムや、ファイルのバージョンを管理するためにチェックサム(MD5チェックサムなど)を使用する構成管理ツールによって管理されるプログラムで実行できるものではありません。 最近のWindowsバージョンでは、セキュリティ上の理由から、読み込まれたライブラリごとに固定アドレスを持つことから離れているため、実行可能ファイル,
明示的なランタイムリンク編集
DLLファイルは、LoadLibrary
(またはLoadLibraryEx
)API関数を使用して、実行時に明示的にロード GetProcAddress
API関数は、エクスポートされたシンボルを名前で検索するために使用され、FreeLibrary
–DLLをアンロードします。 これらの関数は、POSIX標準APIのdlopen
、dlsym
、およびdlclose
に類似しています。,
明示的な実行時リンクの手順は、言語構成ではなくWindows APIに依存するため、関数へのポインタをサポートするどの言語でも同じです。
Delayed loadingEdit
通常、DLLのインポートライブラリに対してリンクされているアプリケーションは、DLLが見つからない場合、アプリケーションが必要とするすべてのDllを見つけることができない限り、Windowsはアプリケーションを実行しないため、DLLが見つからないと起動に失敗します。 しかし、ださるようお願い致しますサインポート図書館のための遅延積の動的図書館があります。,この場合、オペレーティングシステムはアプリケーションの起動時にDLLを見つけたり読み込んだりすることはなく、リンカーによってスタブがアプリケーションに含まれます。 DLLが見つからない、または読み込まれない場合、または呼び出された関数が存在しない場合、アプリケーションは例外を生成し、キャッチされ、適切に処理 がある場合、アプリケーションの取り扱いはいたしません。を除き、それに巻き込まれによる営業システム、プログラム終了を、エラーメッセージを表示します。,
遅延読み込みメカニズムには通知フックもあり、DLLが読み込まれたり、DLL関数が呼び出されたりすると、アプリケーションが追加の処理やエラー処理を実行できるようになります。
コメントを残す