6.3.2 エクスポート アドレス テーブル

エクスポート アドレス テーブルはエクスポートされたエントリ ポイントのアドレスとエクスポートされたデータと絶対値を含んでいます。序数は、序数ベース フィールドの値を引いて、真の、ゼロをベースとするアドレスを得た後で、エクスポート アドレス テーブルへのインデックスとして使われます(したがって、序数ベースが通常の値である1にセットされている場合は、序数の6は、ゼロ ベース インデックスの5と同じなります。)。

エクスポート アドレス テーブルの各エントリは下の表に示す2つの形式のうちの1つを使うフィールドです。指定されたアドレスがエクスポート セクション内のものでない(オプション ヘッダに示されているアドレスと長さによって定義されている)場合には、フィールドはExport RVAで、これはコードまたはデータの中の実際のアドレスです。そうでない場合には、フィールドはForwarder RVAで、これは別のDLL内のシンボルの名前を指定します。

オフセット サイズ フィールド 解説
0 4 Export RVA エクスポートされたシンボルのメモリにロードされたときのアドレスで、イメージ ベースに対する相対アドレスです。たとえば、エクスポートされた関数のアドレスはこれです。
0 4 Forwarder RVA エクスポート セクション内のヌル終了ASCII文字列で、DLL名とエクスポートの名前(たとえばMYDLL.expfunc)またはDLL名とエクスポート(MYDLL.#27)を与えます。

Forwarder RVAは他の何らかのイメージから定義をエクスポートして、それが現在のイメージによってエクスポートされたように見せます。したがって、そのシンボルは同時にインポートとエクスポートが行われます。

たとえば、Windows NTのKERNEL32.DLLでは、HeapAllocという名前のエクスポートが文字列NTDLL.RtlAllocateHeapにフォワードされます。これにより、NT固有のモジュールNTDLL.DLLを使うアプリケーションは実際のインポート参照を含まずにNTDLL.DLLを使うことができます。アプリケーションのインポート テーブルはKERNEL32.DLLだけを参照します。したがって、アプリケーションはWindows NTに固有のものにならず、あらゆるWin32システム上で実行可能です。


戻る