[COFFフォーマット] ヘルプ

Common Object File Format
[ファイルヘッダー] ヘルプの図2参照。

COFFファイル ヘッダ(オブジェクトとイメージ)
オブジェクト ファイルの先頭またはイメージ ファイルのシグネチャ(現在、このシグネチャは"PE\0\0"
(文字"P"と"E"の後に2つのヌル文字)です。
[PEヘッダー] ヘルプ 参照)の直後に、
下記の形式の標準COFFヘッダがあります。
Windows NTのローダはセクションの数
(NumberOfSections)を96までに制限しています。

オフセット

サイズ

フィールド

解説

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.3COFFファイルヘッダ(オブジェクトとイメージ)参照)をオプション ヘッダのNumber of Data Directoriesフィールドと組み合わせて、ヘッダのサイズを正確に計算しなければなりません。さらに、オプション ヘッダのマジック番号が形式に適合していることを検証することも重要です。 オプション ヘッダ自体は大きく3つの部分に分かれています。

オフセット

サイズ

ヘッダサイズ

解説

0

28

標準フィールド

 

これらはUNIX(r)を含めたすべてのCOFFで定義されています。

28

68

Windows固有フィールド

これらにはWindows固有の機能(たとえばサブシステム)をサポートするための追加フィールドが含まれています。

 

96

128

データ ディレクトリ

これらのフィールドは専用テーブルのアドレス/サイズのペアで、イメージ ファイル中に見られ、オペレーティング システムによって使用されます(たとえば、インポート テーブルとエクスポート テーブル)。

 

 

オプション ヘッダの標準フィールド(イメージのみ)

オプション ヘッダの最初の9つのフィールドは、標準フィールドで、COFFのあらゆる実装において定義されています。これらのフィールドには、実行ファイルのロードと実行を行うために役立つ一般的な情報が含まれています。

オフセット

サイズ

フィールド

解説

0

2

Magic

イメージ ファイルの状態を識別するための符号なし整数。もっとも一般的な値は8進の04130x10B)で、通常の実行ファイルであることを表します。04070x107)は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

メモリにロードされたときの、イメージベース相対のデータ セクションの先頭アドレス。

 

 

 

オプション ヘッダのWindows NT固有フィールド(イメージのみ)

次の21個のフィールドは、COFFオプション ヘッダ形式への拡張で、Windows NTのリンカとローダに必要な情報を含んでいます。

オフセット

サイズ

フィールド

解説

28

4

ImageBase

メモリにロードされるときのイメージの先頭バイトの望ましいアドレス。64Kの倍数でなければなりません。DLLの場合のデフォルト値は0x10000000です。Windows CE EXEの場合のデフォルト値は0x00010000です。 Windows NTWindows 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と同じにならなければなりません。