オフセット |
サイズ |
フィールド |
解説 |
0 |
2 |
Machine |
ターゲット マシンの型を識別するための番号です。詳細については3.3.1節「マシン タイプ」を参照してください。 |
2 |
2 |
NumberOfSections |
セクションの数。ヘッダの直後に続くセクション テーブルの大きさを示します。 |
4 |
4 |
TimeDateStamp |
ファイルが作成された日時です。 |
8 |
4 |
PointerToSymbolTable |
COFFシンボル テーブルのファイル オフセット。シンボル テーブルが存在しない場合は0です。 |
12 |
4 |
NumberOfSymbols |
シンボル テーブル内のエントリ数。このデータを使ってシンボル テーブルの直後に続く文字列テーブルの位置決めをすることができます。 |
16 |
2 |
SizeOfOptionalHeader |
実行ファイルのためには必要で、オブジェクト ファイルのためには必要のないオプション ヘッダのサイズ。オブジェクト ファイルではこの値は0になっているはずです。その形式は「オプション ヘッダ」の節に記述されています。 |
18 |
2 |
Characteristics |
ファイルの属性を示すフラグ。特定のフラグの値については3.3.2節「特性」を参照してください。 |
どのイメージ ファイルにも、ローダに情報を提供するためのオプション ヘッダがあります。このヘッダはPEヘッダとしても参照されます。このヘッダはファイルによってはこれを持たないものもある(特にオブジェクト ファイル)という意味でオプションです。イメージ ファイルにとってはこのヘッダは必須です。オブジェクト ファイルはオプション ヘッダを持つこともありますが、一般にはこのヘッダはオブジェクト ファイルではサイズを大きくする以外の働きを持ちません。
オプション ヘッダのサイズは固定ではありません。COFFヘッダのOptional Header Size (3.3節COFFファイルヘッダ(オブジェクトとイメージ)参照)をオプション ヘッダのNumber
of Data Directoriesフィールドと組み合わせて、ヘッダのサイズを正確に計算しなければなりません。さらに、オプション ヘッダのマジック番号が形式に適合していることを検証することも重要です。
オプション ヘッダ自体は大きく3つの部分に分かれています。
オフセット |
サイズ |
ヘッダサイズ |
解説 |
0 |
28 |
標準フィールド |
これらはUNIX(r)を含めたすべてのCOFFで定義されています。 |
28 |
68 |
Windows固有フィールド |
これらにはWindows固有の機能(たとえばサブシステム)をサポートするための追加フィールドが含まれています。 |
96 |
128 |
データ ディレクトリ |
これらのフィールドは専用テーブルのアドレス/サイズのペアで、イメージ
ファイル中に見られ、オペレーティング システムによって使用されます(たとえば、インポート テーブルとエクスポート テーブル)。 |
オプション ヘッダの最初の9つのフィールドは、標準フィールドで、COFFのあらゆる実装において定義されています。これらのフィールドには、実行ファイルのロードと実行を行うために役立つ一般的な情報が含まれています。
オフセット |
サイズ |
フィールド |
解説 |
0 |
2 |
Magic |
イメージ ファイルの状態を識別するための符号なし整数。もっとも一般的な値は8進の0413(0x10B)で、通常の実行ファイルであることを表します。0407(0x107)はROMイメージを表します。 |
2 |
1 |
MajorLinkerVersion |
リンカのメジャー バージョン番号。 |
3 |
1 |
MinorLinkerVersion |
リンカのマイナー バージョン番号。 |
4 |
4 |
SizeOfCode |
コード(テキスト)セクションのサイズまたは複数のセクションがある場合には全コード セクションのサイズ。 |
8 |
4 |
SizeOfInitializedData |
初期化されたデータ セクションのサイズまたは、複数のデータ セクションがある場合にはそれらすべてのセクションの合計。 |
12 |
4 |
SizeOfUninitializedData |
初期化されていないデータ セクション(BSS)のサイズ、または複数のBSSセクションがある場合には、それらすべての合計。 |
16 |
4 |
AddressOfEntryPoint |
実行ファイルがメモリにロードされたときの、イメージ ベース相対のエントリ ポイントのアドレス。プログラム イメージの場合は、これは開始アドレス。デバイス ドライバの場合は、これは初期化関数のアドレス。DLLではエントリ ポイントはオプション。どれも存在しない場合は、このフィールドは0になります。 |
20 |
4 |
BaseOfCode |
メモリにロードされたときの、イメージ ベース相対のコード セクションの先頭アドレス。 |
24 |
4 |
BaseOfData |
メモリにロードされたときの、イメージベース相対のデータ セクションの先頭アドレス。 |
次の21個のフィールドは、COFFオプション ヘッダ形式への拡張で、Windows NTのリンカとローダに必要な情報を含んでいます。
オフセット |
サイズ |
フィールド |
解説 |
28 |
4 |
ImageBase |
メモリにロードされるときのイメージの先頭バイトの望ましいアドレス。64Kの倍数でなければなりません。DLLの場合のデフォルト値は0x10000000です。Windows
CE EXEの場合のデフォルト値は0x00010000です。
Windows NT、Windows 95、および Windows 98の場合のデフォルト値は0x00400000です。 |
32 |
4 |
SectionAlignment |
メモリにロードされるときのセクションの境界(バイト単位)。File Alignmentと等しいか、それよりも大きな値でなければなりません。デフォルトの値はアーキテクチャのページ サイズです。 |
36 |
4 |
FileAlignment |
イメージ ファイル中のセクションの生データの境界を合わせるために使われる係数(バイト単位)。値は512から64Kまでの2の乗数でなければなりません。デフォルトの値は512です。SectionAlignment がアーキテクチャのページ
サイズよりも小さい場合には、これはSectionAlignmentと一致していなければなりません。 |
40 |
2 |
MajorOperatingSystemVersion |
必要なOSのメジャー バージョン番号 |
42 |
2 |
MinorOperatingSystemVersion |
必要なOSのマイナー バージョン番号 |
44 |
2 |
MajorImageVersion |
イメージのメジャー バージョン番号 |
46 |
2 |
MinorImageVersion |
イメージのマイナー バージョン番号 |
48 |
2 |
MajorSubsystemVersion |
サブシステムのメジャー バージョン番号 |
50 |
2 |
MinorSubsystemVersion |
サブシステムのマイナー バージョン番号 |
52 |
4 |
Reserved |
Dd |
56 |
4 |
SizeOfImage |
すべてのヘッダを含めたイメージのサイズ(バイト単位)。Section Alignmentの倍数でなければなりません。 |
60 |
4 |
SizeOfHeaders |
MS-DOSスタブ、PEヘッダ、およびセクション
ヘッダを結合して、FileAlignmentの倍数になるようにしたサイズ。 |
64 |
4 |
CheckSum |
イメージ ファイルのチェックサム。計算のためのアルゴリズムはIMAGHELP.DLL.に組み込まれます。ロード時にすべてのドライバ、ブート時にロードされるDLL、およびサーバになるDLLが検査されます。 |
68 |
2 |
Subsystem |
このイメージを実行するために必要なサブシステムです。詳細は下記の「Windows NTのサブシステム」で説明します。 |
70 |
2 |
DllCharacteristics |
詳細は下記の「DLL 特性」を参照してください。 |
72 |
4 |
SizeOfStackReserve |
保存するスタックのサイズ。Stack Commit Sizeで指定されただけしかコミットされません。残りは一度に1ページずつ予約されたサイズになるまで利用できるようになります。 |
76 |
4 |
SizeOfStackCommit |
コミットするスタックのサイズ。 |
80 |
4 |
SizeOfHeapReserve |
保存するローカル ヒープ スペースのサイズ。Heap Commit Sizeの分だけがコミットされます。残りの部分は予約されたサイズに達するまで、1ページずつ利用できるようになります。 |
84 |
4 |
SizeOfHeapCommit |
コミットするローカル ヒープ スペースのサイズ。 |
88 |
4 |
LoaderFlags |
無効 |
92 |
4 |
NumberOfRvaAndSizes |
オプション ヘッダの残りの部分にあるデータ ディクショナリ エントリの数。それぞれが位置とサイズを記述します。 |
各データ ディクショナリは、Windows NTによって使用されるテーブルまたは文字列のアドレスとサイズを与えます。これらはすべてメモリにロードされ、システムによって実行時に使用できるようになります。データ ディクショナリは、以下のように宣言される8バイトのフィールドです。
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD RVA;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
最初のフィールドはRVAで、これはテーブルの相対仮想アドレスです。RVAはテーブルのアドレスで、ロード時には、イメージのベース アドレスに相対です。2番目のフィールドは、サイズをバイト単位で与えます。オプション ヘッダの最後の部分をなすデータ ディクショナリのリストを以下に示します。
ディレクトリの数は固定されていません。オプション ヘッダのNumberOfRvaAndSizesフィールドは、特定のディレクトリを探す前にチェックされなければなりません。
このテーブルに与えられているRVAがセクションの始まりを指していることや、特定のテーブルを含んでいるセクションは特定の名前を持つことを仮定してはなりません。
オフセット |
サイズ |
フィールド |
解説 |
96 |
8 |
Export
Table |
エクスポート テーブルのアドレスとサイズ |
104 |
8 |
Import
Table |
インポート テーブルのアドレスとサイズ |
112 |
8 |
Resource
Table |
リソース テーブルのアドレスとサイズ |
120 |
8 |
Exception
Table |
例外テーブルのアドレスとサイズ |
128 |
8 |
Certificate
Table |
属性認証テーブルのアドレスとサイズ |
136 |
8 |
Base
Relocation Table |
ベース再配置テーブルのアドレスとサイズ |
144 |
8 |
Debug |
デバッグ データの開始アドレスとサイズ |
152 |
8 |
Architecture |
アーキテクチャ固有データのアドレスとサイズ |
160 |
8 |
Global
Ptr |
グローバル ポインタ レジスタの相対仮想アドレス。この構造体のサイズ メンバは0にセットされます。 |
168 |
8 |
TLS
Table |
スレッド ローカル ストレージ(TLS)テーブルのアドレスとサイズ |
176 |
8 |
Load
Config Table |
ロード コンフィグレーション テーブルのアドレスとサイズ |
184 |
8 |
Bound
Import |
バウンド インポート テーブルのアドレスとサイズ |
192 |
8 |
IAT |
インポート アドレス テーブルのアドレスとサイズ |
200 |
8 |
Delay
Import Descriptor |
遅延インポート記述子のアドレスとサイズ |
208 |
16 |
Reserved |
認証テーブル エントリは属性認証のテーブルを指します。これらの認証はイメージの一部としてはメモリにロードされません。したがって、このエントリの最初のフィールドは、通常はRVAのところがファイル ポインタになっています。
セクション テーブルの各行は、実際には、セクション ヘッダです。このテーブルは、存在する場合には、オプション ヘッダの直後に続きます。この位置が必須なのは、ファイルヘッダにはセクション テーブルへの直接のポインタが含まれていないためです。セクション テーブルの位置は、ヘッダの後の最初のバイトの位置を計算することによって決定されます。ファイルヘッダ内で指定されているオプション ヘッダのサイズを使うようにする必要があります。
セクション テーブルのエントリの数はファイル ヘッダのNumberOfSections
フィールドによって与えられます。セクション テーブル内のエントリには1から始まる番号が付けられます。コードおよびデータ
メモリ セクションのエントリはリンカによって選ばれた順序になります。
イメージ ファイルでは、セクションのための仮想アドレスが、連続する照準になるようにリンカによって割り当てられなければならず、それらはオプション
ヘッダ内のSection Alignの値の倍数でなければなりません。
各セクション ヘッダ(セクション テーブルエントリ)の形式は以下の通りです。エントリごとに合計40バイトあります。
オフセット |
サイズ |
フィールド |
解説 |
0 |
8 |
Name |
8バイトのヌル文字でパディングされるASCII文字列。文字列の長さがちょうど8バイトの場合には、最後にヌル文字は付きません。それよりも長い名前の場合には、このフィールドにはスラッシュ(/)とそれに続く10進数のASCII表現が含まれます。この数は文字列テーブルへのオフセットです。実行イメージは文字列テーブルを使用せず、8文字よりも長いセクション名はサポートしません。オブジェクト ファイル中の長い名前は、実行ファイルに出力される場合には切りつめられます。 |
8 |
4 |
VirtualSize |
メモリにロードされたときのセクションの合計サイズ。この値がSize of Raw Dataよりも大きい場合には、セクションはゼロで埋め文字されます。このフィールドは実行イメージのためにのみ有効で、オブジェクト ファイルの場合には0になります。 |
12 |
4 |
VirtualAddress |
実行イメージの場合、これはメモリにロードされたときのイメージ ベースに相対なセクションの先頭バイトのアドレスです。オブジェクト ファイルの場合、このフィールドは再配置が適用される前の先頭バイトのアドレスです。単純化のために、コンパイラはこれを0にセットします。そうでない場合には任意の値が再配置の最中にオフセットから引かれます。 |
16 |
4 |
SizeOfRawData |
セクションのサイズ(オブジェクト ファイル)またはディスク上の初期化されたデータ(イメージ ファイル)。実行イメージの場合、これはオプション ヘッダのFileAlignment の倍数でなければなりません。これがVirtualSize よりも小さい場合には、セクションの残りの部分は0で埋められます。このフィールドはVirtualSize フィールドが丸められないときに丸められるので、これがVirtualSize よりも大きくなることも同様に可能です。セクションに初期化されていないデータだけが含まれている場合には、このフィールドは0になります。 |
20 |
4 |
PointerToRawData |
COFFファイル内のセクションの最初のページへのポインタ。実行イメージの場合、これはオプション ヘッダのFileAlignment の倍数でなければなりません。オブジェクト ファイルの場合、最高の性能を得るために、値は4バイト境界に合わせられます。セクションに初期化されていないデータだけが含まれている場合には、このフィールドは0になります。 |
24 |
4 |
PointerToRelocations |
セクションの再配置エントリへのファイル ポインタ。実行イメージであるか、再配置がない場合には0にセットされます。 |
28 |
4 |
PointerToLinenumbers |
セクションの行番号エントリの先頭へのファイル ポインタ。COFF行番号がない場合には0にセットされます。 |
32 |
2 |
NumberOfRelocations |
セクション内の再配置エントリの数。実行イメージでは0にセットされます。 |
34 |
2 |
NumberOfLinenumbers |
セクションの行番号エントリの数。 |
36 |
4 |
Characteristics |
セクションの特性を示すフラグ。詳しくは4.1節「セクション フラグ」を参照してください。 |
セクションの初期化されたデータは、単純なバイトのブロックからなります。しかし、すべてがゼロのセクションの場合、セクション データが含まれる必要はありません。
各セクションのためのデータは、セクション ヘッダのPointerToRawData
フィールドによって与えられたオフセットに置かれ、このデータのファイル内でのサイズはSizeOfRawData フィールドによって示されます。 SizeOfRawData が VirtualSizeよりも小さい場合には、残りの部分はゼロで埋められます。
イメージ ファイル内では、セクション データはオプション ヘッダのFileAlignment フィールドによって指定された境界に合わせられなければなりません。セクション データは、対応するセクションのRVA値の順序にしたがって現れなければなりません(セクション テーブル内の個々のセクション ヘッダと同様)。
オプション ヘッダのSection Align値がアーキテクチャのページサイズよりも小さいイメージ
ファイルにはさらに制約があります。そのようなファイルでは。ファイル内のセクション データの位置が、イメージがロードされたときのメモリ内での位置と一致して、セクション
データの物理的位置がRVAと同じにならなければなりません。