4. セクション テーブル(セクション ヘッダ)

セクション テーブルの各行は、実際には、セクション ヘッダです。このテーブルは、存在する場合には、オプション ヘッダの直後に続きます。この位置が必須なのは、ファイルヘッダにはセクション テーブルへの直接のポインタが含まれていないためです。セクション テーブルの位置は、ヘッダの後の最初のバイトの位置を計算することによって決定されます。ファイルヘッダ内で指定されているオプション ヘッダのサイズを使うようにする必要があります。

セクション テーブルのエントリの数はファイル ヘッダの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節「セクション フラグ」を参照してください。


戻る