6.3 .edataセクション(イメージのみ)

.edataという名前の付けられているエクスポート データ セクションは、他のイメージが動的リンクを通じてアクセスできるシンボルについての情報を含んでいます。エクスポートは一般的にはDLLの中に見られますが、DLLはシンボルをインポートすることも同様にできます。

エクスポート セクションの全体的な構造の概要を以下に示します。テーブルの記述はおおむねファイル内で連続しており、示された順序の通りです(とはいえ、これは厳密な要求ではありません)。ディレクトリ テーブルとアドレス テーブルだけはシンボルを序数にしたがってエクスポートする必要があります(序数は、エクスポート アドレス テーブル インデックスとして直接アクセスされるエクスポートです)。名前ポインタテーブル、序数テーブル、およびエクスポート名テーブルはすべてエクスポート名の利用をサポートするために存在しています。

テーブル名 解説
エクスポート ディレクトリ テーブル 1行だけからなるテーブル(デバッグ ディレクトリとは違います)。このテーブルは他のエクスポート テーブルの位置とサイズを示します。
エクスポート アドレス テーブル エクスポートされたシンボルのRVAの配列。これらは実行コードおよびデータ セクション内部のエクスポートされた関数とデータの実際のアドレスです。他のイメージ ファイルはこのテーブルへのインデックス(序数)を使うか、あるいは定義されているのであれば序数に対応するパブリック名を使って、シンボルをインポートすることができます。
名前ポインタ テーブル パブリック エクスポート名へのポインタの配列。昇順にソートされています。
序数テーブル 名前ポインタ テーブルのメンバに対応する序数の配列。対応は位置によって行われ、したがって名前ポインタ テーブルと序数テーブルは同じ数のメンバを持っていなければなりません。各序数はエクスポート アドレス テーブルへのインデックスです。
エクスポート名テーブル 一連のヌルで終わるASCII文字列。名前ポインタ テーブルのメンバがこの領域を指し示します。これらの名前はパブリック名で、これらを通じてシンボルのインポートとエクスポートが行われます。これらは必ずしもイメージ ファイル内部で使用されているプライベート名と同じではありません。

別のイメージ ファイルがシンボルを名前によってインポートするとき、名前ポインタテーブルで一致する文字列が検索されます。一致する文字列が見つかった場合には、それに結びついている序数が、序数テーブルの対応するメンバを参照することによって決定されます(つまり、名前ポインタテーブルで見つかった文字列と同じインデックスを持つ序数テーブルのメンバです)。ここで得られた序数はエクスポート アドレス テーブルへのインデックスであり、これによって望みのシンボルの実際の位置が与えられます。どのエクスポート シンボルにも序数によってアクセスできます。

したがって、序数を直接使うのはより効率的です。これは、一致する文字列のために名前ポインタテーブルを検索する必要がなくなるためです。しかし、エクスポート名を使うほうがより覚えやすい上、ユーザーはシンボルのテーブル インデックスを知る必要がありません。


戻る