PE 形式

この仕様では、Windows ファミリのオペレーティングシステムにおける実行可能 (イメージ) ファイルとオブジェクトファイルの構造について説明します。 これらのファイルは、それぞれポータブル実行可能 (PE) ファイルと共通オブジェクトファイル形式 (COFF) ファイルと呼ばれます。

注意

このドキュメントは Windows 用のツールとアプリケーションの開発を支援するために提供されていますが、すべての点で完全な仕様であることは保証されていません。 Microsoft は、このドキュメントを変更する権利を、予告なしに留保します。

Microsoft ポータブル実行可能ファイルと共通オブジェクトファイル形式の仕様のこのリビジョンによって、この仕様の以前のリビジョンがすべて置き換えられます。

一般的な概念

このドキュメントでは、Microsoft Windows ファミリのオペレーティングシステムで実行可能 (イメージ) ファイルとオブジェクトファイルの構造を指定します。 これらのファイルは、それぞれポータブル実行可能 (PE) ファイルと共通オブジェクトファイル形式 (COFF) ファイルと呼ばれます。 "ポータブル実行可能ファイル" という名前は、その形式がアーキテクチャ固有ではないことを意味します。

次の表では、この仕様全体にわたって表示されるいくつかの概念について説明します。

名前 説明
属性証明書
検証可能なステートメントをイメージに関連付けるために使用される証明書。 複数の検証可能なステートメントをファイルに関連付けることができます。最も役に立つものの1つは、ソフトウェアの製造元による、画像のメッセージダイジェストがどのようなものであることが予想されるかを示すステートメントです。 メッセージダイジェストは、偽造が非常に困難な点を除いて、チェックサムに似ています。 したがって、元のファイルと同じメッセージダイジェストを持つようにファイルを変更することは非常に困難です。 このステートメントは、公開キーまたは秘密キーの暗号化方式を使用して、製造元によって行われていることを確認できます。 このドキュメントでは、以外の属性証明書に関する詳細について説明します。これにより、イメージファイルに挿入することができます。
日付/時刻スタンプ
PE ファイルまたは COFF ファイル内の複数の場所でさまざまな目的で使用されるスタンプ。 ほとんどの場合、各スタンプの形式は、C ランタイムライブラリの時刻関数で使用される形式と同じです。 例外については、「 _ デバッグの _ _ 種類」の「descriptor of IMAGE debug type」を参照してください。 スタンプ値が0または0xFFFFFFFF の場合、実際の日付/時刻スタンプを表すことはできません。
ファイルポインター
リンカー (オブジェクトファイルの場合) またはローダー (イメージファイルの場合) によって処理される前の、ファイル内の項目の位置。 つまり、これは、ディスクに格納されているファイル内の位置です。
リンカー
Microsoft Visual Studio で提供されるリンカーへの参照。
オブジェクトファイル
リンカーへの入力として指定されたファイル。 リンカーは、ローダーによって入力として使用されるイメージファイルを生成します。 "オブジェクトファイル" という用語は、必ずしもオブジェクト指向プログラミングへの接続を意味するわけではありません。
予約済み、0である必要があります
ジェネレーターに対してフィールドの値を0にする必要があることを示すフィールドの説明。コンシューマーはフィールドを無視する必要があります。
相対仮想アドレス (RVA)
イメージファイルでは、これはメモリに読み込まれた後の項目のアドレスであり、イメージファイルのベースアドレスは、そのアドレスから減算されます。 項目の RVA は、ほとんどの場合、ディスク上のファイル内の位置 (ファイルポインター) とは異なります。
オブジェクトファイルでは、メモリ位置が割り当てられていないため、RVA の意味は低くなります。 この場合、RVA は、リンク時に後で再配置が適用される、セクション (この表で後ほど説明します) 内のアドレスになります。 わかりやすくするために、コンパイラでは、各セクションの最初の RVA を0に設定するだけで済みます。
section
PE ファイルまたは COFF ファイル内のコードまたはデータの基本単位。 たとえば、オブジェクトファイル内のすべてのコードを1つのセクション内または (コンパイラの動作に応じて) 結合することができます。各関数は独自のセクションを使用できます。 その他のセクションでは、ファイルのオーバーヘッドが増えますが、リンカーはコード内で選択的にリンクすることができます。 セクションは、Intel 8086 アーキテクチャのセグメントに似ています。 セクション内のすべての生データは、連続して読み込む必要があります。 また、イメージファイルには、いくつかのセクションを含めることができます。これには、特別な目的があります。たとえば、tls や reloc などです。
仮想アドレス (VA)
イメージファイルのベースアドレスが減算されない点を除いて、RVA と同じです。 このアドレスは va と呼ばれます。 Windows は、物理メモリに関係なく、プロセスごとに個別の VA 領域を作成するためです。 ほとんどすべての目的で、VA は単なるアドレスとして考える必要があります。 VA は、イメージが適切な場所に読み込まれない可能性があるため、RVA として予測できません。

概要

次の一覧では、Microsoft PE 実行可能ファイルの形式について説明します。イメージヘッダーのベースは上部にあります。 Ms-dos 2.0 互換 EXE ヘッダーから、PE ヘッダーが MS-DOS 2.0 セクションの直前にある未使用セクションまでのセクション。は、ms-dos 互換のみに使用されます。

  • MS-DOS 2.0 互換 EXE ヘッダー

  • 未使用

  • OEM 識別子

    OEM 情報

    PE ヘッダーへのオフセット

  • MS-DOS 2.0 スタブプログラムと再配置テーブル

  • 未使用

  • PE ヘッダー (8 バイト境界に固定)

  • セクションヘッダー

  • イメージページ:

    情報のインポート

    エクスポート情報

    ベースの再配置

    リソース情報

次の一覧では、Microsoft COFF オブジェクトモジュール形式について説明します。

  • Microsoft COFF ヘッダー

  • セクションヘッダー

  • 生データ:

    code

    data

    デバッグ情報

    移転

ファイルヘッダー

PE ファイルヘッダーは、Microsoft MS-DOS スタブ、PE 署名、COFF ファイルヘッダー、および省略可能なヘッダーで構成されています。 COFF オブジェクトファイルヘッダーは、COFF ファイルヘッダーとオプションのヘッダーで構成されます。 どちらの場合も、ファイルヘッダーの後にセクションヘッダーが続きます。

MS-DOS スタブ (イメージのみ)

MS-DOS スタブは、MS-DOS で実行される有効なアプリケーションです。 これは、EXE イメージの前に配置されます。 リンカーは、既定のスタブをここに配置します。これは、MS-DOS でイメージを実行するときに、"このプログラムを DOS モードで実行することはできません" というメッセージを出力します。 ユーザーは、/スタブリンカーオプションを使用して、別のスタブを指定できます。

場所の0x3cスタブには、PE 署名に対するファイル オフセットがあります。 この情報によりWindows MS-DOS スタブがある場合でも、イメージ ファイルを適切に実行できます。 このファイル オフセットは、リンク中に0x3c位置に配置されます。

署名 (イメージのみ)

MS-DOS スタブの後のオフセット 0x3c で指定されたファイル オフセットは、PE 形式のイメージ ファイルとしてファイルを識別する 4 バイトのシグネチャです。 このシグネチャは "PE \ 0 0" (文字 "P" と "E" の後に 2 つの \ null バイトが続く) です。

COFF ファイル ヘッダー (オブジェクトとイメージ)

オブジェクト ファイルの先頭、またはイメージ ファイルの署名の直後にある は、次の形式の標準 COFF ファイル ヘッダーです。 このローダーはWindowsセクションの数を 96 に制限します。

Offset サイズ フィールド 説明
0
2
Machine
ターゲット マシンの種類を識別する数値。 詳細については、「マシンの種類」 を参照してください
2
2
NumberOfSections
セクションの数。 これは、ヘッダーのすぐ後に続くセクション テーブルのサイズを示します。
4
4
TimeDateStamp
ファイルが作成された時刻を示す、1970 年 1 月 1 日 00:00 (C 実行時 t 値) 以降の秒数の低い 32 ビット _ 。
8
4
PointerToSymbolTable
COFF シンボル テーブルのファイル オフセット。COFF シンボル テーブルが存在しない場合は 0。 COFF デバッグ情報は非推奨とされます。イメージの場合、この値は 0 にする必要があります。
12
4
NumberOfSymbols
シンボル テーブル内のエントリの数。 このデータを使用すれば、シンボル テーブルのすぐ後に続く文字列テーブルを検索することができます。 COFF デバッグ情報は非推奨とされます。イメージの場合、この値は 0 にする必要があります。
16
2
SizeOfOptionalHeader
省略可能なヘッダーのサイズ。実行可能ファイルには必要ですが、オブジェクト ファイルには必要ありません。 オブジェクト ファイルの場合、この値は 0 とする必要があります。 ヘッダー形式の説明については、「省略可能なヘッダー (イメージのみ)」を参照してください
18
2
特性
ファイルの属性を示すフラグ。 特定のフラグ値については、「特性」 を参照してください

マシンの種類

[マシン] フィールドには、CPU の種類を指定する次のいずれかの値があります。 イメージ ファイルは、指定したコンピューターまたは指定したコンピューターをエミュレートするシステムでのみ実行できます。

一定 説明
IMAGE _ FILE _ MACHINE _ UNKNOWN
0x0
このフィールドの内容は、任意のコンピューターの種類に適用できると見なされます
イメージ _ ファイル _ マシン _ AM33
0x1d3
アンシノク AM33
イメージ _ ファイル _ マシン _ AMD64
0x8664
X64
IMAGE _ FILE _ MACHINE _ ARM
0x1c0
ARM リトル エンディアン
イメージ _ ファイル _ マシン _ ARM64
0xaa64
ARM64 リトル エンディアン
イメージ _ ファイル _ マシン _ ARMNT
0x1c4
ARM Thumb-2 リトル エンディアン
IMAGE _ FILE _ MACHINE _ EBC
0xebc
EFI バイト コード
イメージ _ ファイル _ マシン _ I386
0x14c
Intel 386 以降のプロセッサと互換性のあるプロセッサ
イメージ _ ファイル _ マシン _ IA64
0x200
Intel Itanium プロセッサ ファミリ
イメージ _ ファイル _ マシン _ M32R
0x9041
日本の M32R リトル エンディアン
IMAGE _ FILE _ MACHINE _ MIPS16
0x266
MIPS16
イメージ _ ファイル _ マシン _ MIPSFPU
0x366
FPU を使用した MIPS
イメージ _ ファイル _ マシン _ MIPSFPU16
0x466
MIPS16 と FPU
イメージ _ ファイル _ マシン _ POWERPC
0x1f0
Power PC リトル エンディアン
イメージ _ ファイル _ マシン _ POWERPCFP
0x1f1
浮動小数点のサポートを備える Power PC
イメージ _ ファイル _ コンピューター _ R4000
0x166
MIPS リトルエンディアン
イメージ _ ファイル _ コンピューター _ RISCV32
0x5032
RISC-V 32 ビットのアドレス空間
イメージ _ ファイル _ コンピューター _ RISCV64
0x5064
RISC-V 64 ビットのアドレス空間
イメージ _ ファイル _ コンピューター _ RISCV128
0x5128
RISC-V 128 ビットのアドレス空間
イメージ _ ファイル _ コンピューター _ SH3
0x1a2
Hitachi SH3
イメージ _ ファイル _ コンピューター _ SH3DSP
0x1a3
Hitachi SH3 DSP
イメージ _ ファイル _ コンピューター _ SH4
0x1a6
Hitachi SH4
イメージ _ ファイル _ コンピューター _ SH5
0x1a8
Hitachi SH5
イメージ _ ファイル _ コンピューターの _ THUMB
0x1c2
つまみ
イメージ _ ファイル _ コンピューター _ WCEMIPSV2
0x169
MIPS リトルエンディアン WCE v2

特性

特性フィールドには、オブジェクトまたはイメージファイルの属性を示すフラグが含まれています。 現在、次のフラグが定義されています。

フラグ 説明
イメージ _ ファイル _ RELOCS 含んを _ 削除します。
0x0001
Image only、Windows CE、および Microsoft Windows NT 以降。 これは、ファイルに基本再配置が含まれていないため、優先するベースアドレスに読み込む必要があることを示します。 ベースアドレスが使用できない場合、ローダーはエラーを報告します。 リンカーの既定の動作では、実行可能 (EXE) ファイルから基本の再配置が削除されます。
イメージ _ ファイルの _ 実行可能 _ イメージ
0x0002
画像のみ。 これは、イメージファイルが有効で実行可能であることを示します。 このフラグが設定されていない場合は、リンカーエラーを示します。
イメージ _ ファイルの _ 行 _ NUMS が _ 削除
0x0004
COFF の行番号は削除されています。 このフラグは非推奨とされており、ゼロにする必要があります。
イメージ _ ファイルの _ ローカル _ SYMS が _ 削除
0x0008
ローカルシンボルの COFF シンボルテーブルエントリが削除されました。 このフラグは非推奨とされており、ゼロにする必要があります。
画像 _ ファイル _ アグレッシブな _ WS _ TRIM
0x0010
互換性のために残されています。 ワーキングセットを積極的にトリミングします。 このフラグは Windows 2000 以降では非推奨とされており、0にする必要があります。
画像 _ ファイルの _ 大きい _ アドレスを _ 認識する
0x0020
アプリケーションで > 2 GB のアドレスを処理できます。
0x0040
このフラグは将来使用するために予約されています。
画像ファイルの元の _ _ サイズを _ 反転 _
0x0080
リトルエンディアン: 最下位ビット (LSB) は、メモリ内の最上位ビット (MSB) の前にあります。 このフラグは非推奨とされており、ゼロにする必要があります。
イメージ _ ファイルの _ 32 ビット _ コンピューター
0x0100
コンピューターは、32ビットワードアーキテクチャに基づいています。
イメージ _ ファイルの _ デバッグを _ 削除します
0x0200
デバッグ情報はイメージファイルから削除されます。
_ _ _ _ スワップからのイメージファイルのリムーバブル実行 _
0x0400
イメージがリムーバブルメディアにある場合は、イメージを完全に読み込んでスワップファイルにコピーします。
_ _ _ _ スワップからのイメージファイル NET RUN _
0x0800
イメージがネットワークメディア上にある場合は、イメージを完全に読み込んでスワップファイルにコピーします。
イメージ _ ファイル _ システム
0x1000
イメージファイルは、ユーザープログラムではなくシステムファイルです。
イメージ _ ファイル _ DLL
0x2000
イメージファイルはダイナミックリンクライブラリ (DLL) です。 このようなファイルは、ほとんどすべての目的で実行可能ファイルと見なされますが、直接実行することはできません。
イメージ _ ファイル _ の _ システム _ のみ
0x4000
このファイルは、ユニプロセッサコンピューターでのみ実行する必要があります。
画像 _ ファイルの _ バイトが _ 反転 _ しています
0x8000
ビッグエンディアン: MSB は、メモリ内の LSB の前にあります。 このフラグは非推奨とされており、ゼロにする必要があります。

省略可能なヘッダー (画像のみ)

すべてのイメージファイルには、ローダーに情報を提供する省略可能なヘッダーがあります。 このヘッダーは、一部のファイル (具体的にはオブジェクトファイル) には存在しないという意味では省略可能です。 イメージファイルの場合は、このヘッダーが必要です。 オブジェクトファイルには、省略可能なヘッダーを含めることができますが、通常、このヘッダーには、サイズを大きくしない限り、オブジェクトファイルに関数がありません。

省略可能なヘッダーのサイズは固定されません。 COFF ヘッダーの SizeOfOptionalHeader フィールドを使用して、特定のデータ ディレクトリのファイルへのプローブが SizeOfOptionalHeader を超えないことです。 詳細については 、「COFF ファイル ヘッダー (オブジェクトとイメージ)」を参照してください

また 、省略可能なヘッダーの NumberOfRvaAndSizes フィールドを使用して、特定のデータ ディレクトリ エントリのプローブが省略可能なヘッダーを超えるのを確認する必要があります。 さらに、オプションのヘッダーマジック番号を検証して、形式の互換性を確保することが重要です。

省略可能なヘッダーマジック番号は、イメージが PE32 実行可能ファイルか PE32+ 実行可能ファイルかを決定します。

マジック 番号 PE 形式
0x10b
PE32
0x20b
PE32+

PE32+ イメージでは、イメージ サイズを 2 ギガバイトに制限しながら、64 ビットのアドレス空間を使用できます。 その他の PE32+ の変更については、それぞれのセクションで説明します。

省略可能なヘッダー自体には、3 つの主要な部分があります。

Offset (PE32/PE32+) サイズ (PE32/PE32+) ヘッダー部分 説明
0
28/24
標準フィールド
COFF のすべての実装に対して定義されているフィールド (UNIX。
28/24
68/88
Windows固有のフィールド
システムの特定の機能をサポートWindowsフィールド (サブシステムなど)。
96/112
変数
データ ディレクトリ
イメージ ファイルに含まれていますが、オペレーティング システム (インポート テーブルやエクスポート テーブルなど) によって使用される特殊なテーブルのアドレスとサイズのペア。

省略可能なヘッダー標準フィールド (イメージのみ)

省略可能なヘッダーの最初の 8 つのフィールドは、COFF のすべての実装に対して定義される標準フィールドです。 これらのフィールドには、実行可能ファイルの読み込みと実行に役立つ一般的な情報が含まれています。 PE32+ 形式では変更されません。

Offset サイズ フィールド 説明
0
2
マジック
イメージ ファイルの状態を識別する符号なし整数。 最も一般的な数0x10B、通常の実行可能ファイルとして識別されます。 0x107 ROM イメージとして識別され、PE32 0x20Bとして識別されます。
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
メモリに読み込まれるときに、コードの開始セクションのイメージ ベースを基準にしたアドレス。

PE32 には、この追加フィールドが含まれます。このフィールドは、BaseOfCode に続く PE32+ には存在しません。

Offset サイズ フィールド 説明
24
4
BaseOfData
データの開始セクションがメモリに読み込まれるときに、その画像ベースを基準にしたアドレス。

省略可能なヘッダーWindows-Specificフィールド (イメージのみ)

次の 21 のフィールドは、COFF 省略可能なヘッダー形式の拡張です。 このライブラリには、リンカーとローダーによって必要な追加情報が含Windows。

Offset (PE32/ PE32+) サイズ (PE32/PE32+) フィールド 説明
28/24
4/8
ImageBase
メモリに読み込まれた場合のイメージの最初のバイトの優先アドレス。は 64 K の倍数である必要があります。DLL の既定値は0x10000000。 既定では、WINDOWS CE EXEs が0x00010000。 Windows NT、Windows 2000、Windows XP、Windows 95、Windows 98、Windows Me の既定値は 0x00400000 です。
32/32
4
SectionAlignment
セクションがメモリに読み込まれるときのその配置 (バイト単位)。 FileAlignment 以上である必要があります。 既定値は、アーキテクチャのページ サイズです。
36/36
4
FileAlignment
イメージ ファイル内のセクションの生データを揃えるために使用される配置係数 (バイト単位)。 値は、512 ~ 64 K の2の累乗でなければなりません。 既定値は 512 です。 SectionAlignment がアーキテクチャのページサイズより小さい場合、FileAlignment は SectionAlignment と一致する必要があります。
40/40
2
MajorOperatingSystemVersion
必要なオペレーティング システムのメジャー バージョン番号。
42/42
2
MinorOperatingSystemVersion
必要なオペレーティング システムのマイナー バージョン番号。
44/44
2
MajorImageVersion
イメージのメジャー バージョン番号。
46/46
2
MinorImageVersion
イメージのマイナー バージョン番号。
48/48
2
MajorSubsystemVersion
サブアセンブリのメジャー バージョン番号。
50/50
2
MinorSubsystemVersion
サブアセンブリのマイナー バージョン番号。
52/52
4
Win32VersionValue
予約済み。0にする必要があります。
56/56
4
SizeOfImage
イメージがメモリに読み込まれるときの、すべてのヘッダーを含むイメージのサイズ (バイト単位)。 SectionAlignment の倍数である必要があります。
60/60
4
SizeOfHeaders
FileAlignment の倍数に切り上げられた、MS-DOS スタブ、PE ヘッダー、セクションヘッダーの合計サイズ。
64/64
4
CheckSum
イメージファイルのチェックサム。 チェックサムを計算するためのアルゴリズムは IMAGHELP.DLL に組み込まれています。 読み込み時に検証が行われるかどうかを確認するには、すべてのドライバー、起動時に読み込まれた dll、および重要な Windows プロセスに読み込まれている dll を使用します。
68/68
2
Subsystem
このイメージを実行するために必要なサブシステム。 詳細については、「 Windows サブシステム」を参照してください。
70/70
2
DllCharacteristics
詳細については、この仕様で後述する「 DLL の特性 」を参照してください。
72/72
4/8
SizeOfStackReserve
予約するスタックのサイズ。 SizeOfStackCommit のみがコミットされます。残りの部分は、予約サイズに達するまで、一度に1ページずつ使用できるようになります。
76/80
4/8
SizeOfStackCommit
コミットするスタックのサイズ。
80/88
4/8
SizeOfHeapReserve
予約するローカル ヒープ領域のサイズ。 SizeOfHeapCommit のみがコミットされます。残りの部分は、予約サイズに達するまで、一度に1ページずつ使用できるようになります。
84/96
4/8
SizeOfHeapCommit
コミットするローカル ヒープ領域のサイズ。
88/104
4
LoaderFlags
予約済み。0にする必要があります。
92/108
4
NumberOfRvaAndSizes
省略可能なヘッダーの残りの部分にあるデータディレクトリエントリの数。 それぞれによって、場所とサイズが記述されます。
Windowsサブ

オプションのヘッダーのサブシステムフィールドに対して定義されている次の値によって、イメージの実行に必要なサブシステム (存在する場合) Windows が決まります。

一定 説明
イメージ _ サブシステムが _ 不明です
0
不明なサブシステム
イメージ _ サブシステム _ ネイティブ
1
デバイスドライバーとネイティブ Windows プロセス
イメージ _ サブシステム _ WINDOWS _ GUI
2
Windows グラフィカルユーザーインターフェイス (GUI) サブシステム
イメージ _ サブシステム _ WINDOWS _ CUI
3
Windows 文字サブシステム
イメージ _ サブシステム _ OS2 _ cui
5
OS/2 文字サブシステム
イメージ _ サブシステム _ POSIX _ CUI
7
Posix 文字サブシステム
イメージ _ サブシステム _ ネイティブ _ ウィンドウ
8
ネイティブ Win9x ドライバー
イメージ _ サブシステム _ WINDOWS _ CE _ GUI
9
Windows CE
イメージ _ サブシステム _ EFI _ アプリケーション
10
拡張ファームウェアインターフェイス (EFI) アプリケーション
イメージ _ サブシステム _ EFI _ ブート _ サービス _ ドライバー
11
EFI ドライバーとブートサービス
イメージ _ サブシステム _ EFI _ ランタイム _ ドライバー
12
ランタイムサービスを備えた EFI ドライバー
イメージ _ サブシステム _ EFI _ ROM
13
EFI ROM イメージ
イメージ _ サブシステム _ XBOX
14
XBOX
イメージ _ サブシステムの _ WINDOWS _ ブート _ アプリケーション
16
ブートアプリケーションを Windows します。
DLL の特性

次の値は、オプションのヘッダーの DllCharacteristics フィールドに対して定義されています。

一定 説明
0x0001
予約済み。0にする必要があります。
0x0002
予約済み。0にする必要があります。
0x0004
予約済み。0にする必要があります。
0x0008
予約済み。0にする必要があります。
イメージ _ DLLCHARACTERISTICS _ -高 _ エントロピ _ VA
0x0020
イメージは、高いエントロピ64ビットの仮想アドレス空間を処理できます。
イメージ _ DLLCHARACTERISTICS 特性_
動的 _ ベース
0x0040
DLL は読み込み時に再配置できます。
イメージ _ DLLCHARACTERISTICS 特性_
強制 _ 整合性
0x0080
コードの整合性チェックが適用されます。
イメージ _ DLLCHARACTERISTICS 特性_
NX _ 互換性
0x0100
イメージは NX と互換性があります。
イメージ _ DLLCHARACTERISTICS _ ( _ 分離なし)
0x0200
分離を認識しますが、イメージを分離しません。
イメージ _ DLLCHARACTERISTICS 特性 ( _ _ SEH なし)
0x0400
構造化例外 (Standard Edition) 処理は使用しません。 このイメージでは、Standard Edition ハンドラーを呼び出すことはできません。
イメージ _ DLLCHARACTERISTICS _ _ バインドなし
0x0800
イメージをバインドしないでください。
イメージ _ DLLCHARACTERISTICS ( _ APPCONTAINER)
0x1000
イメージは、AppContainer で実行する必要があります。
イメージ _ DLLCHARACTERISTICS _ WDM _ ドライバー
0x2000
WDM ドライバー。
イメージ _ DLLCHARACTERISTICS _ ガード _ CF
0x4000
Image は Control Flow Guard をサポートしています。
イメージ _ DLLCHARACTERISTICS _ ターミナル _ サーバー _ 対応
0x8000
ターミナルサーバーを認識します。

省略可能なヘッダーデータディレクトリ (画像のみ)

各データディレクトリには、Windows 使用するテーブルまたは文字列のアドレスとサイズが示されます。 これらのデータディレクトリエントリはすべて、実行時にシステムによって使用されるように、メモリに読み込まれます。 データディレクトリは、次の宣言を持つ8バイトのフィールドです。

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

最初のフィールド VirtualAddress は、実際にはテーブルの RVA です。 RVA は、テーブルが読み込まれるときに、イメージのベースアドレスを基準とするテーブルのアドレスです。 2番目のフィールドは、サイズをバイト単位で示します。 次の表は、省略可能なヘッダーの最後の部分を形成するデータディレクトリを示しています。

ディレクトリの数が固定されていないことに注意してください。 特定のディレクトリを探す前に、省略可能なヘッダーの NumberOfRvaAndSizes フィールドを確認します。

また、このテーブルの RVAs がセクションの先頭を指しているか、特定のテーブルを含むセクションに特定の名前があることを想定しないでください。

オフセット (PE/PE32 +) サイズ フィールド 説明
96/112
8
テーブルのエクスポート
エクスポートテーブルのアドレスとサイズ。 詳細については、「 . データセクション (イメージのみ)」を参照してください。
104/120
8
テーブルのインポート
インポートテーブルのアドレスとサイズ。 詳細については、「 idata」セクションを参照してください。
112/128
8
リソーステーブル
リソーステーブルのアドレスとサイズ。 詳細については、「 rsrc」セクションを参照してください。
120/136
8
例外テーブル
例外テーブルのアドレスとサイズ。 詳細については、「 Pdata」セクションを参照してください。
128/144
8
証明書テーブル
属性証明書テーブルのアドレスとサイズ。 詳細については、「 属性証明書テーブル (イメージのみ)」を参照してください。
136/152
8
ベース再配置テーブル
ベース再配置テーブルのアドレスとサイズ。 詳細については、「 . Reloc セクション (イメージのみ)」を参照してください。
144/160
8
デバッグ
デバッグデータの開始アドレスとサイズ。 詳細については、「 . Debug」セクションを参照してください。
152/168
8
アーキテクチャ
予約済み、0である必要があります
160/176
8
グローバル Ptr
グローバルポインターレジスタに格納される値の RVA。 この構造体のサイズメンバーを0に設定する必要があります。
168/184
8
TLS テーブル
スレッドローカルストレージ (TLS) テーブルのアドレスとサイズ。 詳細については、「 . Tls」セクションを参照してください。
176/192
8
構成テーブルの読み込み
読み込み構成テーブルのアドレスとサイズ。 詳細については、「 構成構造の読み込み (イメージのみ)」を参照してください。
184/200
8
バインドされたインポート
バインドされたインポートテーブルのアドレスとサイズ。
192/208
8
IAT
インポートアドレステーブルのアドレスとサイズ。 詳細については、「 アドレステーブルのインポート」を参照してください。
200/216
8
遅延インポート記述子
遅延インポート記述子のアドレスとサイズ。 詳細については、「 インポートテーブルの遅延読み込み (イメージのみ)」を参照してください。
208/224
8
CLR ランタイムヘッダー
CLR ランタイムヘッダーのアドレスとサイズ。 詳細については、「 cormeta (オブジェクトのみ)」を参照してください。
216/232
8
予約済み、0である必要があります

証明書テーブルのエントリは、属性証明書のテーブルを指します。 これらの証明書は、イメージの一部としてメモリに読み込まれません。 そのため、このエントリの最初のフィールド (通常は RVA) はファイルポインターです。

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

セクションテーブルの各行は、実際にはセクションヘッダーです。 このテーブルは、省略可能なヘッダー (存在する場合) の直後に続きます。 ファイルヘッダーに section テーブルへの直接ポインターが含まれていないため、この配置が必要です。 代わりに、セクションテーブルの位置は、ヘッダーの後の最初のバイトの位置を計算することによって決定されます。 ファイルヘッダーで指定されているように、省略可能なヘッダーのサイズを使用してください。

Section テーブル内のエントリの数は、ファイルヘッダーの NumberOfSections フィールドによって指定されます。 Section テーブルのエントリには、1から始まる番号が付けられます。 コードとデータメモリセクションのエントリは、リンカーによって選択された順序に従っています。

イメージファイルでは、セクションの VAs は、見出しが昇順で隣接するように、リンカーによって割り当てられる必要があります。また、省略可能なヘッダーの SectionAlignment 値の倍数である必要があります。

各セクションヘッダー (セクションテーブルエントリ) の形式は次のとおりです (エントリあたり合計40バイト)。

Offset サイズ フィールド 説明
0
8
名前
8バイトで、null で埋め込まれた UTF-8 でエンコードされた文字列。 文字列の長さが完全に8文字の場合、終端の null はありません。 長い名前の場合、このフィールドにはスラッシュ (/) が続き、その後に文字列テーブルのオフセットである10進数の ASCII 表現が続きます。 実行可能イメージは文字列テーブルを使用せず、8文字を超えるセクション名をサポートしません。 オブジェクトファイル内の長い名前は、実行可能ファイルに出力されると、切り捨てられます。
8
4
VirtualSize
メモリに読み込まれるときのセクションの合計サイズ。 この値が SizeOfRawData より大きい場合、セクションはゼロで埋められます。 このフィールドは、実行可能イメージに対してのみ有効であり、オブジェクトファイルの場合は0に設定する必要があります。
12
4
VirtualAddress
実行可能イメージの場合は、セクションがメモリに読み込まれるときに、イメージベースを基準とするセクションの最初のバイトのアドレス。 オブジェクトファイルの場合、このフィールドは再配置が適用される前の最初のバイトのアドレスです。わかりやすくするために、コンパイラはこれを0に設定する必要があります。 それ以外の場合は、再配置時にオフセットから減算される任意の値です。
16
4
SizeOfRawData
セクションのサイズ (オブジェクトファイルの場合) またはディスク上で初期化されたデータのサイズ (イメージファイルの場合)。 実行可能イメージの場合、これは省略可能なヘッダーからの FileAlignment の倍数である必要があります。 この値が VirtualSize より小さい場合、セクションの残りの部分はゼロで埋められます。 SizeOfRawData フィールドは丸められますが、VirtualSize フィールドは指定されていないため、SizeOfRawData が VirtualSize よりも大きくなる可能性があります。 セクションに初期化されていないデータのみが含まれている場合、このフィールドは0にする必要があります。
20
4
ポインター Torawdata
COFF ファイル内のセクションの最初のページへのファイルポインター。 実行可能イメージの場合、これは省略可能なヘッダーからの FileAlignment の倍数である必要があります。 オブジェクトファイルの場合、最適なパフォーマンスを得るには、値を4バイトの境界に配置する必要があります。 セクションに初期化されていないデータのみが含まれている場合、このフィールドは0にする必要があります。
24
4
ポインターの位置を
セクションの再配置エントリの先頭へのファイルポインター。 実行可能イメージの場合は0に設定され、再配置が存在しない場合はに設定されます。
28
4
PointerToLinenumbers
セクションの行番号エントリの先頭へのファイルポインター。 COFF 行番号がない場合、これは0に設定されます。 COFF デバッグ情報は非推奨とされるため、イメージの場合、この値は0にする必要があります。
32
2
NumberOfRelocations
セクションの再配置エントリの数。 これは、実行可能イメージの場合は0に設定されます。
34
2
NumberOfLinenumbers
セクションの行番号エントリの数。 COFF デバッグ情報は非推奨とされるため、イメージの場合、この値は0にする必要があります。
36
4
特性
セクションの特性を記述するフラグ。 詳細については、「 セクションフラグ」を参照してください。

セクションフラグ

セクションヘッダーの特性フィールドのセクションフラグは、セクションの特性を示します。

フラグ 説明
0x00000000
将来使用するために予約されています。
0x00000001
将来使用するために予約されています。
0x00000002
将来使用するために予約されています。
0x00000004
将来使用するために予約されています。
イメージ _ SCN _ タイプ _ _ パッドなし
0x00000008
セクションを次の境界に埋め込むことはできません。 このフラグは互換性のために残されていますが、イメージ _ SCN ALIGN 1bytes に置き換えられてい _ _ ます。 これは、オブジェクトファイルに対してのみ有効です。
0x00000010
将来使用するために予約されています。
イメージ _ SCN _ CNT _ コード
0x00000020
このセクションには実行可能コードが含まれています。
イメージ _ SCN _ CNT の _ 初期化された _ データ
0x00000040
セクションに、初期化されたデータが含まれています。
イメージ _ SCN _ CNT の _ 初期化されていない _ データ
0x00000080
セクションに初期化されていないデータが含まれています。
イメージ _ SCN _ LNK _ OTHER
0x00000100
将来使用するために予約されています。
イメージ _ SCN の _ LNK _ 情報
0x00000200
このセクションには、コメントまたはその他の情報が含まれています。 .Drectve セクションには、この型があります。 これは、オブジェクトファイルに対してのみ有効です。
0x00000400
将来使用するために予約されています。
イメージ _ SCN の _ LNK の _ 削除
0x00000800
セクションはイメージの一部ではありません。 これは、オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ LNK _ COMDAT
0x00001000
セクションには COMDAT データが含まれている。 詳細については 、「COMDAT セクション (オブジェクトのみ)」を参照してください。 これは、オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ GPREL
0x00008000
セクションには、グローバル ポインター (GP) を介して参照されるデータが含まれている。
IMAGE _ SCN _ MEM _ PURGEABLE
0x00020000
将来使用するために予約されています。
IMAGE _ SCN _ MEM _ 16BIT
0x00020000
将来使用するために予約されています。
IMAGE _ SCN _ MEM _ LOCKED
0x00040000
将来使用するために予約されています。
IMAGE _ SCN _ MEM _ プリロード
0x00080000
将来使用するために予約されています。
IMAGE _ SCN _ ALIGN _ 1BYTES
0x00100000
1 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 2BYTES
0x00200000
2 バイト境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 4BYTES
0x00300000
データを 4 バイト境界に配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 8BYTES
0x00400000
8 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 16BYTES
0x00500000
16 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 32BYTES
0x00600000
データを 32 バイト境界に配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 64BYTES
0x00700000
64 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 128BYTES
0x00800000
128 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 256BYTES
0x00900000
256 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 512BYTES
0x00A00000
512 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 1024BYTES
0x00B00000
1024 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 2048BYTES
0x00C00000
2048 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 4096BYTES
0x00D00000
4,096 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ ALIGN _ 8192BYTES
0x00E00000
8192 バイトの境界にデータを配置します。 オブジェクト ファイルに対してだけ有効です。
IMAGE _ SCN _ LNK _ NRELOC _ OVFL
0x01000000
セクションには、拡張再配置が含まれている。
IMAGE _ SCN _ MEM _ DISCARDABLE
0x02000000
セクションは、必要に応じて破棄できます。
IMAGE _ SCN _ MEM _ が _ キャッシュされない
0x04000000
セクションをキャッシュできません。
IMAGE _ SCN _ MEM _ NOT _ PAGED
0x08000000
セクションはページ可能ではありません。
IMAGE _ SCN _ MEM _ SHARED
0x10000000
セクションはメモリ内で共有できます。
IMAGE _ SCN _ MEM _ EXECUTE
0x20000000
セクションはコードとして実行できます。
IMAGE _ SCN _ MEM _ READ
0x40000000
セクションは読み取り可能です。
IMAGE _ SCN _ MEM _ WRITE
0x80000000
セクションは書き込み可能です。

IMAGE SCN LNK NRELOC OVFL は、セクションの再配置の数が、セクション ヘッダーで予約されている 16 ビットを超 _ _ _ _ えていると示します。 ビットが設定され、セクション ヘッダーの NumberOfRelocations フィールドが 0xffff の場合、実際の再配置数は最初の再配置の 32 ビット VirtualAddress フィールドに格納されます。 IMAGE _ SCN _ _ LNK NRELOC OVFL が設定され、 セクションの再配置の数0xffff少ない _ 場合はエラーです。

グループ化されたセクション (オブジェクトのみ)

"$"? 文字 (ドル記号) には、オブジェクト ファイル内のセクション名に特別な解釈があります。

オブジェクト セクションの内容を含むイメージ セクションを決定すると、リンカーは "$" を破棄します。 およびそれに続くすべての文字。 したがって、 という名前のオブジェクト セクションです。text$X は 、実際にはイメージの .text セクションに貢献します。

ただし、"$" の後の文字は? は、画像セクションへの投稿の順序を決定します。 同じオブジェクト セクション名を持つすべてのコン投稿は、イメージ内で連続して割り当て、コン投稿のブロックは、オブジェクト セクション名で構文順に並べ替えされます。 したがって、セクション名 が .text$X のオブジェクト ファイル内のすべては 、.text$W の投稿の後 、.text$Y の投稿の前にまとめて終了します。

イメージ ファイルのセクション名に "$" が含まれるのは一度もないのでしょうか。 文字。

ファイルのその他の内容

これまで説明したデータ構造 (省略可能なヘッダーを含む) はすべて、ファイルの先頭からの固定オフセット (ファイルが MS-DOS スタブを含むイメージの場合は PE ヘッダーから) に格納されます。

COFF オブジェクトまたはイメージ ファイルの残りの部分には、必ずしも特定のファイル オフセットにあるとは限らないデータ ブロックが含まれています。 代わりに、場所は、省略可能なヘッダーまたはセクション ヘッダー内のポインターによって定義されます。

例外は、SectionAlignment 値がアーキテクチャのページ サイズより小さいイメージ (Intel x86 の場合は 4 K、MIPS の場合は 8 K、Itanium の場合は 8 K) のイメージの場合です。 SectionAlignment の説明については、「省略可能なヘッダー (イメージのみ)」を参照してください。 この場合、セクション 5.1「セクション データ」で説明するように、セクション データのファイル オフセットに制約があります。 もう 1 つの例外は、属性証明書とデバッグ情報はイメージ ファイルの末尾に配置する必要があります。属性証明書テーブルはデバッグ セクションの直前に配置する必要があります。これは、ローダーがこれらをメモリにマップしないのでです。 ただし、属性証明書とデバッグ情報に関する規則は、オブジェクト ファイルには適用されません。

セクション データ

セクションの初期化されたデータは、単純なバイト ブロックで構成されます。 ただし、すべてのゼロを含むセクションの場合、セクション データを含める必要はありません。

各セクションのデータは、セクション ヘッダーの PointerToRawData フィールドによって指定されたファイル オフセットに位置します。 ファイル内のこのデータのサイズは、SizeOfRawData フィールドで示されます。 SizeOfRawData が VirtualSize より小さい場合、剰余はゼロで埋め込まれます。

イメージ ファイルでは、セクション データは、省略可能なヘッダーの FileAlignment フィールドで指定された境界に配置する必要があります。 セクション データは、対応するセクションの RVA 値の順に表示する必要があります (セクション テーブルの個々のセクション ヘッダーと同様)。

省略可能なヘッダーの SectionAlignment 値がアーキテクチャのページ サイズより小さい場合は、イメージ ファイルに追加の制限があります。 このようなファイルの場合、ファイル内のセクション データの場所は、イメージの読み込み時にメモリ内の位置と一致する必要があります。そのため、セクション データの物理オフセットは RVA と同じになります。

COFF 再配置 (オブジェクトのみ)

オブジェクト ファイルには COFF 再配置が含まれています。この再配置では、イメージ ファイルに配置され、その後メモリに読み込まれるときにセクション データを変更する方法を指定します。

参照されるシンボルはすべて、フラット アドレス空間内のアドレスに既に割り当てられているため、イメージ ファイルに COFF 再配置は含められていない。 イメージには、.reloc セクションのベース再配置の形式で再配置情報が含まれている (イメージに IMAGE _ FILE _ RELOCS _ STRIPPED 属性がない限り)。 詳細については 、「.reloc セクション (イメージのみ)」を参照してください

オブジェクト ファイル内の各セクションについて、固定長レコードの配列には、セクションの COFF 再配置が保持されます。 配列の位置と長さは、セクション ヘッダーで指定します。 配列の各要素の形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
VirtualAddress
再配置が適用される項目のアドレス。 これは、 セクションの先頭からのオフセットと、セクションの RVA/Offset フィールドの値です。 セクション テーブル (セクション ヘッダー) を参照してください。 たとえば、セクションの最初のバイトが 0x10 のアドレスを持つ場合、3 番目のバイトのアドレスは 0x12。
4
4
SymbolTableIndex
シンボル テーブルへの 0 から始るインデックス。 このシンボルは、再配置に使用されるアドレスを示します。 指定したシンボルにセクション ストレージ クラスがある場合、シンボルのアドレスは、同じ名前の最初のセクションを持つアドレスです。
8
2
Type
実行する再配置の種類を示す 値です。 有効な再配置の種類は、マシンの種類によって異なります。 「型 インジケーター」を参照してください

SymbolTableIndex フィールドによって参照されるシンボルにストレージ クラス IMAGE SYM CLASS SECTION がある場合、シンボルのアドレスは セクション _ _ _ の先頭です。 通常、 セクションは、オブジェクト ファイルがアーカイブ (ライブラリ) の一部である場合を除き、同じファイル内にあります。 その場合、 セクションは、現在のオブジェクト ファイルと同じアーカイブ メンバー名を持つアーカイブ内の他のオブジェクト ファイルで見つかる可能性があります。 (アーカイブ メンバー名とのリレーションシップは、インポート テーブルのリンク 、つまり .idata セクションで使用されます)。

型インジケーター

再配置レコードの Type フィールドは、実行する再配置の種類を示します。 マシンの種類ごとに異なる再配置の種類が定義されます。

x64 プロセッサ

次の再配置の種類インジケーターは、x64 および互換性のあるプロセッサに対して定義されています。

一定 説明
IMAGE _ REL _ AMD64 _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ AMD64 _ ADDR64
0x0001
再配置ターゲットの 64 ビット VA。
IMAGE _ REL _ AMD64 _ ADDR32
0x0002
再配置ターゲットの 32 ビット VA。
IMAGE _ REL _ AMD64 _ ADDR32NB
0x0003
イメージ ベース (RVA) なしの 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ REL32
0x0004
再配置後のバイトからの 32 ビット相対アドレス。
IMAGE _ REL _ AMD64 _ REL32 _ 1
0x0005
再配置からのバイト距離 1 に対する相対 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ REL32 _ 2
0x0006
再配置からのバイト距離 2 に対する 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ REL32 _ 3
0x0007
再配置からのバイト距離 3 に対する 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ REL32 _ 4
0x0008
再配置からのバイト距離 4 に対する相対 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ REL32 _ 5
0x0009
再配置からのバイト距離 5 に対する相対 32 ビット アドレス。
IMAGE _ REL _ AMD64 _ セクション
0x000A
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ AMD64 _ SECREL
0x000B
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ AMD64 _ SECREL7
0x000C
ターゲットを含むセクションのベースからの 7 ビット符号なしオフセット。
IMAGE _ REL _ AMD64 _ トークン
0x000D
CLR トークン。
IMAGE _ REL _ AMD64 _ SREL32
0x000E
オブジェクトに出力される 32 ビット符号付きスパン依存値。
IMAGE _ REL _ AMD64 _ PAIR
0x000F
スパンに依存する値の直後に続く必要があるペア。
IMAGE _ REL _ AMD64 _ SSPAN32
0x0010
リンク時に適用される 32 ビット符号付きスパン依存値。
ARM プロセッサ

ARM プロセッサには、次の再配置の種類インジケーターが定義されています。

一定 説明
IMAGE _ REL _ ARM _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ ARM _ ADDR32
0x0001
ターゲットの 32 ビット VA。
IMAGE _ REL _ ARM _ ADDR32NB
0x0002
ターゲットの 32 ビット RVA。
IMAGE _ REL _ ARM _ BRANCH24
0x0003
ターゲットに対する 24 ビット相対移動。
IMAGE _ REL _ ARM _ BRANCH11
0x0004
サブルーチン呼び出しへの参照。 参照は、11 ビット オフセットを持つ 2 つの 16 ビット命令で構成されます。
IMAGE _ REL _ ARM _ REL32
0x000A
再配置後のバイトからの 32 ビット相対アドレス。
IMAGE _ REL _ ARM _ セクション
0x000E
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ ARM _ SECREL
0x000F
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ ARM _ MOV32
0x0010
ターゲットの 32 ビット VA。 この再配置は、低い 16 ビットの MOVW 命令と、高い 16 ビットの MOVT を使用して適用されます。
IMAGE _ REL _ THUMB _ MOV32
0x0011
ターゲットの 32 ビット VA。 この再配置は、低い 16 ビットの MOVW 命令と、高い 16 ビットの MOVT を使用して適用されます。
IMAGE _ REL _ THUMB _ BRANCH20
0x0012
命令は、2 バイトのアラインされたターゲットに対する 21 ビットの相対ずれで固定されます。 ずれの最も重要なビットは常に 0 であり、格納されません。 この再配置は、Thumb-2 32 ビットの条件付き B 命令に対応します。
未使用
0x0013
IMAGE _ REL _ THUMB _ BRANCH24
0x0014
命令は、2 バイトのアラインされたターゲットに対する 25 ビットの相対ずれで固定されます。 ずれの最も重要なビットは 0 で、格納されません。この再配置は Thumb-2 B 命令に対応します。
IMAGE _ REL _ THUMB _ BLX23
0x0015
命令は、4 バイトのアラインされたターゲットに対する 25 ビットの相対ずれで固定されます。 ディスプレイスメントの低い 2 ビットは 0 で、格納されません。
この再配置は Thumb-2 BLX 命令に対応しています。
IMAGE _ REL _ ARM _ PAIR
0x0016
再配置は、ARM REFHI または THUMB REFHI の直後 _ にのみ _ 有効です。 SymbolTableIndex には、シンボル テーブルへのインデックスではなく、移動が含まれている。
ARM64 プロセッサ

ARM64 プロセッサには、次の再配置の種類インジケーターが定義されています。

一定 説明
IMAGE _ REL _ ARM64 _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ ARM64 _ ADDR32
0x0001
ターゲットの 32 ビット VA。
IMAGE _ REL _ ARM64 _ ADDR32NB
0x0002
ターゲットの 32 ビット RVA。
IMAGE _ REL _ ARM64 _ BRANCH26
0x0003
B 命令と BL 命令の場合、ターゲットに対する 26 ビットの相対ずれ。
IMAGE _ REL _ ARM64 _ PAGEBASE _ REL21
0x0004
ADRP 命令のターゲットのページ ベース。
IMAGE _ REL _ ARM64 _ REL21
0x0005
命令 ADR のターゲットに対する 12 ビットの相対移動
IMAGE _ REL _ ARM64 _ PAGEOFFSET _ 12A
0x0006
ターゲットの 12 ビット のページ オフセット。シフトがゼロの命令 ADD/ADDS (イミディエイト) 用です。
IMAGE _ REL _ ARM64 _ PAGEOFFSET _ 12L
0x0007
命令 LDR のターゲットの 12 ビット ページ オフセット (インデックス付き、符号なし即時)。
IMAGE _ REL _ ARM64 _ SECREL
0x0008
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ ARM64 _ SECREL _ LOW12A
0x0009
ターゲットのセクション オフセットのビット 0:11。0 シフトの命令 ADD/ADDS (イミディエイト) の場合。
IMAGE _ REL _ ARM64 _ SECREL _ HIGH12A
0x000A
ターゲットのセクション オフセットのビット 12:23。0 シフトの命令 ADD/ADDS (即時)。
IMAGE _ REL _ ARM64 _ SECREL _ LOW12L
0x000B
命令 LDR のターゲットのセクション オフセットのビット 0:11 (インデックス付き、符号なし即時)。
IMAGE _ REL _ ARM64 _ トークン
0x000C
CLR トークン。
IMAGE _ REL _ ARM64 _ セクション
0x000D
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ ARM64 _ ADDR64
0x000E
再配置ターゲットの 64 ビット VA。
IMAGE _ REL _ ARM64 _ BRANCH19
0x000F
条件付き B 命令の再配置ターゲットへの 19 ビット オフセット。
IMAGE _ REL _ ARM64 _ BRANCH14
0x0010
再配置ターゲットへの 14 ビット オフセット (命令 TNZ と TBNZ の場合)。
IMAGE _ REL _ ARM64 _ REL32
0x0011
再配置後のバイトからの 32 ビット相対アドレス。
高いメモリを搭載したスーパーH プロセッサ

次の再配置の種類インジケーターは、SH3 プロセッサと SH4 プロセッサに対して定義されています。 SH5 固有の再配置は、SHM (SH メディア) と表されます。

一定 説明
IMAGE _ REL _ SH3 _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ SH3 _ DIRECT16
0x0001
ターゲット シンボルの VA を含む 16 ビット位置への参照。
IMAGE _ REL _ SH3 _ DIRECT32
0x0002
ターゲット シンボルの 32 ビット VA。
IMAGE _ REL _ SH3 _ DIRECT8
0x0003
ターゲット シンボルの VA を含む 8 ビット位置への参照。
IMAGE _ REL _ SH3 _ DIRECT8 _ WORD
0x0004
ターゲット シンボルの有効な 16 ビット VA を含む 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ DIRECT8 _ LONG
0x0005
ターゲット シンボルの有効な 32 ビット VA を含む 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ DIRECT4
0x0006
低い 4 ビットにターゲット シンボルの VA が含まれる 8 ビット位置への参照。
IMAGE _ REL _ SH3 _ DIRECT4 _ WORD
0x0007
低い 4 ビットにターゲット シンボルの有効な 16 ビット VA が含まれている 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ DIRECT4 _ LONG
0x0008
低い 4 ビットにターゲット シンボルの有効な 32 ビット VA が含まれている 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ PCREL8 _ WORD
0x0009
ターゲット シンボルの有効な 16 ビット相対オフセットを含む 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ PCREL8 _ LONG
0x000A
ターゲット シンボルの有効な 32 ビット相対オフセットを含む 8 ビット命令への参照。
IMAGE _ REL _ SH3 _ PCREL12 _ WORD
0x000B
低い 12 ビットにターゲット シンボルの有効な 16 ビット相対オフセットが含まれている 16 ビット命令への参照。
IMAGE _ REL _ SH3 _ STARTOF _ セクション
0x000C
ターゲット シンボルを含むセクションの VA である 32 ビット位置への参照。
IMAGE _ REL _ SH3 _ SIZEOF _ セクション
0x000D
ターゲット シンボルを含むセクションのサイズである 32 ビット位置への参照。
IMAGE _ REL _ SH3 _ セクション
0x000E
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ SH3 _ SECREL
0x000F
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ SH3 _ DIRECT32 _ NB
0x0010
ターゲット シンボルの 32 ビット RVA。
IMAGE _ REL _ SH3 _ GPREL4 _ LONG
0x0011
GP の相対値。
IMAGE _ REL _ SH3 _ トークン
0x0012
CLR トークン。
IMAGE _ REL _ SHM _ PCRELPT
0x0013
longwords の現在の命令からのオフセット。 NOMODE ビットが設定されていない場合は、ビット 32 で低ビットの逆を挿入して、PTA または PTB を選択します。
IMAGE _ REL _ SHM _ REFLO
0x0014
32 ビット アドレスの低い 16 ビット。
IMAGE _ REL _ SHM _ REFHALF
0x0015
32 ビット アドレスの高い 16 ビット。
IMAGE _ REL _ SHM _ RELLO
0x0016
相対アドレスの低い 16 ビット。
IMAGE _ REL _ SHM _ RELHALF
0x0017
相対アドレスの高い 16 ビット。
IMAGE _ REL _ SHM _ PAIR
0x0018
再配置は、REFHALF、RELHALF、または RELLO 再配置の直後にのみ有効です。 再配置の SymbolTableIndex フィールドには、シンボル テーブルへのインデックスではなく、移動が含まれている。
IMAGE _ REL _ SHM _ NOMODE
0x8000
再配置では、セクション モードは無視されます。
IBM PowerPC プロセッサ

次の再配置の種類インジケーターは、プロセッサのPowerPCされます。

一定 説明
IMAGE _ REL _ PPC _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ PPC _ ADDR64
0x0001
ターゲットの 64 ビット VA。
IMAGE _ REL _ PPC _ ADDR32
0x0002
ターゲットの 32 ビット VA。
IMAGE _ REL _ PPC _ ADDR24
0x0003
ターゲットの VA の低い 24 ビット。 これは、ターゲット シンボルが絶対であり、元の値に拡張できる場合にのみ有効です。
IMAGE _ REL _ PPC _ ADDR16
0x0004
ターゲットの VA の低い 16 ビット。
IMAGE _ REL _ PPC _ ADDR14
0x0005
ターゲットの VA の低い 14 ビット。 これは、ターゲット シンボルが絶対であり、元の値に拡張できる場合にのみ有効です。
IMAGE _ REL _ PPC _ REL24
0x0006
シンボルの位置に対する 24 ビット PC 相対オフセット。
IMAGE _ REL _ PPC _ REL14
0x0007
シンボルの位置に対する 14 ビット PC 相対オフセット。
IMAGE _ REL _ PPC _ ADDR32NB
0x000A
ターゲットの 32 ビット RVA。
IMAGE _ REL _ PPC _ SECREL
0x000B
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ PPC _ セクション
0x000C
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ PPC _ SECREL16
0x000F
セクションの先頭からのターゲットの 16 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ PPC _ REFHI
0x0010
ターゲットの 32 ビット VA の高い 16 ビット。 これは、完全なアドレスを読み込む 2 命令シーケンスの最初の命令に使用されます。 この再配置の直後に PAIR 再配置を行う必要があります。その後に、SymbolTableIndex に、再配置先の場所から取り出された上位 16 ビットに追加された符号付き 16 ビットのずれが含まれている必要があります。
IMAGE _ REL _ PPC _ REFLO
0x0011
ターゲットの VA の低い 16 ビット。
IMAGE _ REL _ PPC _ PAIR
0x0012
REFHI または SECRELHI 再配置の直後にのみ有効な再配置。 SymbolTableIndex には、シンボル テーブルへのインデックスではなく、移動が含まれている。
IMAGE _ REL _ PPC _ SECRELLO
0x0013
セクションの先頭からのターゲットの 32 ビット オフセットの低い 16 ビット。
IMAGE _ REL _ PPC _ GPREL
0x0015
GP レジスタに対するターゲットの 16 ビット符号付きディスプレイスメント。
IMAGE _ REL _ PPC _ トークン
0x0016
CLR トークン。
Intel 386 プロセッサ

次の再配置の種類インジケーターは、Intel 386 および互換性のあるプロセッサに対して定義されています。

一定 説明
IMAGE _ REL _ I386 _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ I386 _ DIR16
0x0001
サポートされていません。
IMAGE _ REL _ I386 _ REL16
0x0002
サポートされていません。
IMAGE _ REL _ I386 _ DIR32
0x0006
ターゲットの 32 ビット VA。
IMAGE _ REL _ I386 _ DIR32NB
0x0007
ターゲットの 32 ビット RVA。
IMAGE _ REL _ I386 _ SEG12
0x0009
サポートされていません。
IMAGE _ REL _ I386 _ セクション
0x000A
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ I386 _ SECREL
0x000B
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ I386 _ トークン
0x000C
CLR トークン。
IMAGE _ REL _ I386 _ SECREL7
0x000D
ターゲットを含むセクションのベースからの 7 ビット オフセット。
IMAGE _ REL _ I386 _ REL32
0x0014
ターゲットに対する 32 ビット相対移動。 これにより、x86 相対分岐と呼び出し命令がサポートされます。
Intel Itanium プロセッサ ファミリ (IPF)

次の再配置の種類インジケーターは、Intel Itanium プロセッサ ファミリと互換性のあるプロセッサに対して定義されています。 命令の再配置では、再配置オフセットにバンドルのオフセットとスロット番号が使用されます。

一定 説明
IMAGE _ REL _ IA64 _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ IA64 _ IMM14
0x0001
命令の再配置の後に ADDEND 再配置を行い、その値がターゲット アドレスに追加された後、IMM14 バンドル内の指定されたスロットに挿入されます。 再配置ターゲットは絶対である必要があります。または、イメージを修正する必要があります。
IMAGE _ REL _ IA64 _ IMM22
0x0002
命令の再配置の後に ADDEND 再配置を行い、その値がターゲット アドレスに追加された後、IMM22 バンドル内の指定されたスロットに挿入されます。 再配置ターゲットは絶対である必要があります。または、イメージを修正する必要があります。
IMAGE _ REL _ IA64 _ IMM64
0x0003
この再配置のスロット番号は 1 である必要があります。 再配置の後には、IMM64 バンドルの 3 つのスロットすべてに格納される前に、ターゲット アドレスに値を追加する ADDEND 再配置を行います。
イメージの _ REL _ IA64 _ DIR32
0x0004
ターゲットの32ビット VA。 これは/LARGEADDRESSAWARE: NO image でのみサポートされています。
イメージの _ REL _ IA64 _ DIR64
0x0005
ターゲットの64ビット VA。
イメージの _ REL _ IA64 _ PCREL21B
0x0006
この命令は、16ビットのアラインされたターゲットに対する25ビットの相対変位によって修正されます。 変位の下位4ビットはゼロであり、格納されません。
イメージの _ REL _ IA64 _ PCREL21M
0x0007
この命令は、16ビットのアラインされたターゲットに対する25ビットの相対変位によって修正されます。 変位の下位4ビット (ゼロ) は格納されません。
イメージの _ REL _ IA64 _ PCREL21F
0x0008
この再配置のオフセットの LSBs にはスロット番号が含まれている必要がありますが、残りはバンドルアドレスです。 バンドルは、16ビットのアラインされたターゲットに対する25ビットの相対変位によって修正されます。 変位の下位4ビットはゼロであり、格納されません。
イメージの _ REL _ IA64 _ GPREL22
0x0009
命令の再配置の後に、ターゲットアドレスに値が追加され、GPREL22 バンドルに対して計算されて適用される22ビットの GP 相対オフセットという値を持つ加後の再配置を行うことができます。
イメージの _ REL _ IA64 _ LTOFF22
0x000A
命令は、ターゲットシンボルのリテラルテーブルエントリへの22ビットの GP 相対オフセットを使用して修正されます。 リンカーは、この再配置に基づいてこのリテラルテーブルエントリを作成し、その後に続く加の再配置を作成します。
イメージの _ REL _ IA64 _ セクション
0x000B
セクションの16ビットのセクションインデックスには、ターゲットが含まれています。 これは、デバッグ情報をサポートするために使用されます。
イメージの _ REL _ IA64 _ SECREL22
0x000C
命令は、セクションの先頭からのターゲットの22ビットオフセットを使用して修正されます。 この再配置の後には、値フィールドに、セクションの先頭からのターゲットの32ビットの符号なしオフセットが格納されます。
イメージの _ REL _ IA64 _ SECREL64I
0x000D
この再配置のスロット番号は1である必要があります。 命令は、セクションの先頭からのターゲットの64ビットオフセットを使用して修正されます。 この再配置の直後には、値フィールドに、セクションの先頭からのターゲットの32ビットの符号なしオフセットが格納されています。
イメージの _ REL _ IA64 _ SECREL32
0x000E
セクションの先頭からのターゲットの32ビットオフセットによって修正されるデータのアドレス。
イメージの _ REL _ IA64 _ DIR32NB
0x0010
ターゲットの32ビット RVA。
イメージの _ REL _ IA64 _ SREL14
0x0011
これは、再配置可能な2つのターゲットの差を含む、符号付き14ビットの即時に適用されます。 これは、コンパイラが既にこの値を出力したことを示す、リンカーの宣言型フィールドです。
イメージの _ REL _ IA64 _ SREL22
0x0012
これは、再配置可能な2つのターゲットの差を含む、符号付き22ビットのイミディエイトに適用されます。 これは、コンパイラが既にこの値を出力したことを示す、リンカーの宣言型フィールドです。
イメージの _ REL _ IA64 _ SREL32
0x0013
これは、再配置可能な2つの値の差を含む、符号付き32ビットのイミディエイトに適用されます。 これは、コンパイラが既にこの値を出力したことを示す、リンカーの宣言型フィールドです。
イメージの _ REL _ IA64 _ UREL32
0x0014
これは、再配置可能な2つの値の差を含む、符号なし32ビットのイミディエイトに適用されます。 これは、コンパイラが既にこの値を出力したことを示す、リンカーの宣言型フィールドです。
イメージの _ REL _ IA64 _ PCREL60X
0x0015
MLX バンドルの BRL 命令として常に維持される60ビット PC 相対フィックスアップ。
イメージの _ REL _ IA64 _ PCREL60B
0x0016
60ビット PC 相対 fixup。 ターゲットのディスプレイスメントが符号付き25ビットフィールドに収まる場合は、MBB バンドル全体を NOP で変換します。スロット1では B、スロット2では25ビットの BR 命令 (4 つの最下位ビットがゼロ、ドロップ)。
イメージの _ REL _ IA64 _ PCREL60F
0x0017
60ビット PC 相対 fixup。 ターゲットのディスプレイスメントが符号付き25ビットフィールドに収まる場合は、NOP を使用して、バンドル全体を MFB バンドルに変換します。スロット1の F と25ビット (4 つの最下位ビット) BR 命令スロット2。
イメージの _ REL _ IA64 _ PCREL60I
0x0018
60ビット PC 相対 fixup。 ターゲットのディスプレイスメントが符号付き25ビットフィールドに収まる場合は、バンドル全体を NOP を使用して MIB バンドルに変換します。スロット1では I、スロット2では25ビット (4 つの最下位ビット) BR 命令。
イメージの _ REL _ IA64 _ PCREL60M
0x0019
60ビット PC 相対 fixup。 ターゲットのディスプレイスメントが符号付き25ビットフィールドに収まる場合は、NOP を使用して、バンドル全体を MMB バンドルに変換します。スロット1では M、スロット2では25ビット (4 つの最下位ビット) BR 命令。
イメージの _ REL _ IA64 _ IMMGPREL64
0x001a
64ビットの GP 相対 fixup。
イメージの _ REL _ IA64 _ トークン
0x001b
CLR トークンです。
イメージの _ REL _ IA64 _ GPREL32
0x001c
32ビットの GP 相対 fixup。
イメージ _ REL _ IA64 _ 加
0x001F
再配置は、IMM14、IMM22、IMM64、GPREL22、LTOFF22、LTOFF64、SECREL22、SECREL64I、SECREL32 のいずれかの再配置の直後にある場合にのみ有効です。 この値は、データではなく、バンドル内の命令に適用される加を含みます。
MIPS プロセッサ

次の再配置の種類のインジケーターは、MIPS プロセッサ用に定義されています。

一定 説明
イメージの _ REL _ MIP _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ MIPS _ REFHALF
0x0001
ターゲットの 32 ビット VA の高い 16 ビット。
IMAGE _ REL _ MIPS _ REFWORD
0x0002
ターゲットの 32 ビット VA。
IMAGE _ REL _ MIPS _ JMPADDR
0x0003
ターゲットの VA の低い 26 ビット。 これにより、MIPS J および MIP 命令がサポートされます。
IMAGE _ REL _ MIPS _ REFHI
0x0004
ターゲットの 32 ビット VA の高い 16 ビット。 これは、完全なアドレスを読み込む 2 命令シーケンスの最初の命令に使用されます。 この再配置の直後に PAIR 再配置を行う必要があります。その後に、SymbolTableIndex に、再配置先の場所から取り出された上位 16 ビットに追加された符号付き 16 ビットのずれが含まれている必要があります。
IMAGE _ REL _ MIPS _ REFLO
0x0005
ターゲットの VA の低い 16 ビット。
IMAGE _ REL _ MIPS _ GPREL
0x0006
GP レジスタに対するターゲットの 16 ビット符号付きディスプレイスメント。
IMAGE _ REL _ MIPS _ リテラル
0x0007
IMAGE _ REL _ MIPS _ GPREL と同じです。
IMAGE _ REL _ MIPS _ セクション
0x000A
セクションの 16 ビット セクション インデックスには、ターゲットが含まれている。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ MIPS _ SECREL
0x000B
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ MIPS _ SECRELLO
0x000C
セクションの先頭からのターゲットの 32 ビット オフセットの低い 16 ビット。
IMAGE _ REL _ MIPS _ SECRELHI
0x000D
セクションの先頭からのターゲットの 32 ビット オフセットの高い 16 ビット。 IMAGE _ REL _ MIPS _ PAIR の再配置は、この直後に行う必要があります。 PAIR 再配置の SymbolTableIndex には、再配置される場所から取り出される上位 16 ビットに追加される符号付き 16 ビットのずれが含まれている。
IMAGE _ REL _ MIPS _ JMPADDR16
0x0010
ターゲットの VA の低い 26 ビット。 これにより、MIPS16 の INSTRUCTION がサポートされます。
IMAGE _ REL _ MIPS _ REFWORDNB
0x0022
ターゲットの 32 ビット RVA。
IMAGE _ REL _ MIPS _ ペア
0x0025
再配置は、REFHI または SECRELHI 再配置の直後にのみ有効です。 SymbolTableIndex には、シンボル テーブルへのインデックスではなく、移動が含まれている。
大日本 M32R

次の再配置の種類のインジケーターは、1 台の M32R プロセッサに対して定義されています。

一定 説明
IMAGE _ REL _ M32R _ ABSOLUTE
0x0000
再配置は無視されます。
IMAGE _ REL _ M32R _ ADDR32
0x0001
ターゲットの 32 ビット VA。
IMAGE _ REL _ M32R _ ADDR32NB
0x0002
ターゲットの 32 ビット RVA。
IMAGE _ REL _ M32R _ ADDR24
0x0003
ターゲットの 24 ビット VA。
IMAGE _ REL _ M32R _ GPREL16
0x0004
ターゲットの GP レジスタからの 16 ビット オフセット。
IMAGE _ REL _ M32R _ PCREL24
0x0005
プログラム カウンター (PC) からのターゲットの 24 ビット オフセット。左に 2 ビットシフトし、符号拡張
IMAGE _ REL _ M32R _ PCREL16
0x0006
ターゲットの PC からの 16 ビット オフセット(左に 2 ビットシフトし、符号拡張)
IMAGE _ REL _ M32R _ PCREL8
0x0007
ターゲットの PC からの 8 ビット オフセット(左に 2 ビットシフトし、符号拡張)
IMAGE _ REL _ M32R _ REFHALF
0x0008
ターゲット VA の 16 MBS。
IMAGE _ REL _ M32R _ REFHI
0x0009
LSB 符号拡張用に調整された、ターゲット VA の 16 MBS。 これは、完全な 32 ビット アドレスを読み込む 2 命令シーケンスの最初の命令に使用されます。 この再配置の直後に PAIR 再配置を行う必要があります。その後に、SymbolTableIndex に、再配置先の場所から取り出された上位 16 ビットに追加された符号付き 16 ビットのずれが含まれている必要があります。
IMAGE _ REL _ M32R _ REFLO
0x000A
ターゲット VA の 16 LSB。
IMAGE _ REL _ M32R _ PAIR
0x000B
再配置は REFHI 再配置に従う必要があります。 SymbolTableIndex には、シンボル テーブルへのインデックスではなく、移動が含まれている。
IMAGE _ REL _ M32R _ セクション
0x000C
ターゲットを含む セクションの 16 ビット セクション インデックス。 これは、デバッグ情報をサポートするために使用されます。
IMAGE _ REL _ M32R _ SECREL
0x000D
セクションの先頭からのターゲットの 32 ビット オフセット。 これは、デバッグ情報と静的スレッド ローカル ストレージをサポートするために使用されます。
IMAGE _ REL _ M32R _ トークン
0x000E
CLR トークン。

COFF 行番号 (非推奨)

COFF 行番号は生成されなくなったので、今後は使用されません。

COFF 行番号は、ソース ファイル内のコードと行番号の関係を示します。 COFF 行番号の Microsoft 形式は標準の COFF に似ていますが、1 つのセクションが複数のソース ファイル内の行番号に関連付け可能に拡張されています。

COFF 行番号は、固定長レコードの配列で構成されます。 配列の場所 (ファイル オフセット) とサイズは、セクション ヘッダーで指定します。 各行番号レコードの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
型 ( * )
これは、SymbolTableIndex と VirtualAddress の 2 つのフィールドの共用体です。 SymbolTableIndex または RVA が使用されるかどうかは、Linenumber の値によって異なります。
4
2
Linenumber
0 以外の場合、このフィールドは 1 から構成される行番号を指定します。 0 の場合、Type フィールドは関数のシンボル テーブル インデックスとして解釈されます。

Type フィールドは、SymbolTableIndex と VirtualAddress という 2 つの 4 バイト フィールドの共用体です。

Offset サイズ フィールド 説明
0
4
SymbolTableIndex
Linenumber が 0 の場合に使用されます。関数のシンボル テーブルエントリへのインデックス。 この形式は、行番号レコードのグループが参照する関数を示すために使用されます。
0
4
VirtualAddress
Linenumber が 0 以外の場合に使用されます。指定されたソース行に対応する実行可能コードの RVA。 オブジェクト ファイルには、 セクション内の VA が含まれている。

行番号レコードでは、Linenumber フィールドを 0 に設定し、シンボル テーブルの関数定義をポイントするか、正の整数 (行番号) とオブジェクト コード内の対応するアドレスを指定することで、標準の行番号エントリとして機能できます。

行番号エントリのグループは、常に最初の形式 (関数シンボルのインデックス) で始まります。 これが セクションの最初の行番号レコードである場合は、セクションの COMDAT フラグが設定されている場合は、関数の COMDAT シンボル名にもなっています。 「COMDAT セクション (オブジェクトのみ)」を参照してください。 シンボル テーブル内の関数の補助レコードには、この同じ行番号レコードを指す Linenumber フィールドへのポインターがあります。

関数を識別するレコードの後には、実際の行番号情報を提供する任意の数の行番号エントリ (つまり、Linenumber が 0 より大きいエントリ) が続きます。 これらのエントリは、関数の先頭を基準とする 1 から始まり、最初の行を除く関数内のすべてのソース行を表します。

たとえば、次の例の最初の行番号レコードでは、ReverseSign 関数 (ReverseSign の SymbolTableIndex と Linenumber を 0 に設定) を指定します。 次に、次に示すように、Linenumber 値が 1、2、3 のレコードが続きます。

// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2:  return -1 * i;
3: }

COFF シンボル テーブル

このセクションのシンボル テーブルは、従来の COFF 形式から継承されます。 デバッグ情報とはMicrosoft Visual C++異なります。 ファイルには COFF シンボル テーブルとデバッグ情報Visual C++含め、2 つのシンボル テーブルは別々に保持されます。 一部の Microsoft ツールでは、COMDAT 情報のリンカーへの通信など、限られた重要な目的でシンボル テーブルが使用されます。 セクション名とファイル名、およびコードおよびデータ シンボルは、シンボル テーブルに一覧表示されます。

シンボル テーブルの場所は、COFF ヘッダーに示されます。

シンボル テーブルはレコードの配列で、各長さ 18 バイトです。 各レコードは、標準または補助的なシンボル テーブル レコードです。 標準レコードは、シンボルまたは名前を定義し、次の形式を持ちます。

Offset サイズ フィールド 説明
0
8
Name ( * )
3 つの 構造体の共用体で表されるシンボルの名前。 名前が 8 バイトを超える長さではない場合は、8 バイトの配列が使用されます。 詳細については、「シンボル名表現 」を参照してください
8
4

シンボルに関連付けられている値。 このフィールドの解釈は、SectionNumber と StorageClass によって異なります。 一般的な意味は、再配置可能なアドレスです。
12
2
SectionNumber
セクション テーブルに 1 から基づくインデックスを使用して、セクションを識別する符号付き整数。 一部の値は、セクション 5.4.2「セクション番号の値」で定義されている特別な意味を持ちます。
14
2
Type
型を表す数値。 Microsoft ツールでは、このフィールドを 0x20 (関数) または (関数0x0) に設定します。 詳細については、「型表現」 を参照してください
16
1
StorageClass
ストレージ クラスを表す列挙値。 詳細については、「 クラス 」をStorageしてください
17
1
NumberOfAuxSymbols
このレコードの後に続く補助シンボル テーブル エントリの数。

0 個以上の補助シンボル テーブル レコードは、各標準シンボル テーブル レコードの直後に続きます。 ただし、通常、複数の補助シンボル テーブル レコードは標準のシンボル テーブル レコードに従います (長いファイル名を持つ .file レコードを除く)。 各補助レコードは標準のシンボル テーブル レコード (18 バイト) と同じサイズですが、新しいシンボルを定義するのではなく、補助レコードは最後に定義されたシンボルに関する追加情報を提供します。 使用する複数の形式の選択は、StorageClass フィールドによって異なります。 補助シンボル テーブル レコードの現在定義されている形式は、セクション 5.5「補助シンボル レコード」に示されています。

COFF シンボル テーブルを読み取るツールでは、解釈が不明な補助シンボル レコードを無視する必要があります。 これにより、シンボル テーブル形式を拡張して、既存のツールを壊さずに、新しい補助レコードを追加できます。

シンボル名表現

シンボル テーブルの ShortName フィールドは、名前自体を含む 8 バイトで構成されます (長さ 8 バイト以下の場合、または ShortName フィールドが文字列テーブルへのオフセットを指定する場合)。 名前自体またはオフセットが指定されているかどうかを判断するには、最初の 4 バイトで 0 と等しいかどうかをテストします。

規則により、名前は 0 で終われる UTF-8 でエンコードされた文字列として扱われます。

Offset サイズ フィールド 説明
0
8
ShortName
8 バイトの配列。 名前の長さが 8 バイト未満の場合、この配列の右側には null が埋め込まれます。
0
4
ゼロ
名前が 8 バイトを超える場合に、すべてのゼロに設定されるフィールド。
4
4
Offset
文字列テーブルへのオフセット。

セクション番号の値

通常、シンボル テーブル エントリの [セクション値] フィールドは、セクション テーブルの 1 から構成されるインデックスです。 ただし、このフィールドは符号付き整数であり、負の値を受け取ることができます。 次の値は 1 未満で、特別な意味を持ちます。

一定 説明
IMAGE _ SYM _ UNDEFINED
0
シンボル レコードにセクションがまだ割り当てられていない。 値 0 は、外部シンボルへの参照が他の場所で定義されている場合に示します。 0 以外の値は、値で指定されたサイズの共通シンボルです。
IMAGE _ SYM _ ABSOLUTE
-1
シンボルは絶対値 (再配置不可) であり、アドレスではありません。
IMAGE _ SYM _ DEBUG
-2
シンボルは、一般的な型またはデバッグ情報を提供しますが、 セクションには対応しています。 Microsoft ツールでは、この設定を .file レコード (ストレージ クラス FILE) と共に使用します。

型表現

シンボル テーブル エントリの Type フィールドには 2 バイトが含まれます。各バイトは型情報を表します。 LSB は単純 (基本) データ型を表し、MSB は複合型 (次の場合) を表します。

MSB LSB
複合型: none、pointer、function、array。
基本型: 整数、浮動小数点数など。

基本型には次の値が定義されています。ただし、通常、Microsoft ツールではこのフィールドを使用し、LSB を 0 に設定します。 代わりに、デバッグVisual C++型を示すために使用されます。 ただし、完全性を高め、可能な COFF 値をここに示します。

一定 説明
IMAGE _ SYM _ TYPE _ NULL
0
型情報または不明な基本型はありません。 Microsoft ツールでは、この設定を使用します
IMAGE _ SYM _ TYPE _ VOID
1
有効な型はありません。void ポインターと関数と一緒に使用される
IMAGE _ SYM _ TYPE _ CHAR
2
文字 (符号付きバイト)
IMAGE _ SYM _ TYPE _ SHORT
3
2 バイト符号付き整数
IMAGE _ SYM _ TYPE _ INT
4
自然整数型 (通常は 4 バイトWindows)
IMAGE _ SYM _ TYPE _ LONG
5
4 バイト符号付き整数
IMAGE _ SYM _ TYPE _ FLOAT
6
4 バイト浮動小数点数
IMAGE _ SYM _ TYPE _ DOUBLE
7
8 バイト浮動小数点数
IMAGE _ SYM _ TYPE _ STRUCT
8
構造体
IMAGE _ SYM _ TYPE _ UNION
9
共用体
IMAGE _ SYM _ TYPE _ ENUM
10
列挙型
IMAGE _ SYM _ TYPE _ MOE
11
列挙型のメンバー (特定の値)
IMAGE _ SYM _ TYPE _ BYTE
12
バイト。unsigned 1 バイト整数
IMAGE _ SYM _ TYPE _ WORD
13
単語;unsigned 2 バイト整数
IMAGE _ SYM _ TYPE _ UINT
14
自然サイズの符号なし整数 (通常は 4 バイト)
IMAGE _ SYM _ TYPE _ DWORD
15
符号なし 4 バイト整数

最も重要なバイトは、シンボルが LSB で指定された基本型のポインター、関数を返す、または配列であるかどうかを指定します。 Microsoft ツールでは、このフィールドを使用してシンボルが関数であるかどうかを示すだけで、結果として得られる 2 つの値だけが [型] フィールド0x0と0x20値になります。 ただし、他のツールでは、このフィールドを使用してより多くの情報を伝達できます。

関数属性を正しく指定することが非常に重要です。 この情報は、増分リンクが正しく機能するために必要です。 一部のアーキテクチャでは、他の目的で情報が必要になる場合があります。

一定 説明
IMAGE _ SYM _ DTYPE _ NULL
0
派生型なし。シンボルは単純なスカラー変数です。
IMAGE _ SYM _ DTYPE _ ポインター
1
シンボルは基本型へのポインターです。
IMAGE _ SYM _ DTYPE _ 関数
2
シンボルは、基本型を返す関数です。
IMAGE _ SYM _ DTYPE _ ARRAY
3
シンボルは基本型の配列です。

ストレージ クラス

シンボル テーブルの StorageClass フィールドは、シンボルが表す定義の種類を示します。 次の表に、使用できる値を示します。 StorageClass フィールドは符号なし 1 バイト整数です。 したがって、特殊な値 -1 は、その符号なし等価の値を意味0xFF。

従来の COFF 形式では多くのストレージ クラス値を使用しますが、Microsoft ツールでは、ほとんどのシンボリック情報に対して Visual C++ デバッグ形式に依存し、一般に EXTERNAL (2)、STATIC (3)、FUNCTION (101)、FILE (103) の 4 つのストレージ クラス値のみを使用します。 下の 2 番目の列見出しを除き、"Value" はシンボル レコードの Value フィールドを意味する必要があります (その解釈はストレージ クラスとして見つかった数値に依存します)。

一定 [値] フィールドの説明/解釈
IMAGE _ SYM _ クラス _ の _ _ 関数の終了
-1 (0xFF)
デバッグを目的として、関数の末尾を表す特殊なシンボル。
IMAGE _ SYM _ クラス _ NULL
0
割り当てられたストレージ クラスはありません。
IMAGE _ SYM _ クラス _ AUTOMATIC
1
自動 (スタック) 変数。 [値] フィールドは、スタック フレーム オフセットを指定します。
IMAGE _ SYM _ クラス _ EXTERNAL
2
Microsoft ツールが外部シンボルに使用する値。 [値] フィールドは、セクション番号が IMAGE _ SYM UNDEFINED (0) の場合のサイズ _ を示します。 セクション番号が 0 ではない場合、Value フィールドはセクション内のオフセットを指定します。
IMAGE _ SYM _ クラス _ STATIC
3
セクション内のシンボルのオフセット。 [値] フィールドが 0 の場合、シンボルはセクション名を表します。
IMAGE _ SYM _ クラス _ レジスタ
4
レジスタ変数。 [値] フィールドは、レジスタ番号を指定します。
IMAGE _ SYM クラス EXTERNAL _ _ _ DEF
5
外部で定義されているシンボル。
IMAGE _ SYM _ クラス _ ラベル
6
モジュール内で定義されているコード ラベル。 [値] フィールドは、セクション内のシンボルのオフセットを指定します。
IMAGE _ SYM クラス UNDEFINED _ _ _ LABEL
7
定義されていないコード ラベルへの参照。
構造体 _ の IMAGE SYM _ クラス _ _ _ メンバー
8
構造体メンバー。 [値] フィールドは、n 番目のメンバーを指定します。
IMAGE _ SYM _ クラス _ 引数
9
関数の仮引数 (パラメーター)。 [値] フィールドは、n 番目の引数を指定します。
IMAGE _ SYM _ クラス _ の構造体 _ タグ
10
構造体のタグ名エントリ。
UNION _ の IMAGE SYM クラス _ _ _ _ メンバー
11
共用体メンバー。 [値] フィールドは、n 番目のメンバーを指定します。
IMAGE _ SYM クラス UNION _ _ _ タグ
12
Union タグ名エントリ。
IMAGE _ SYM _ クラス _ の型 _ 定義
13
Typedef エントリ。
IMAGE _ SYM クラス UNDEFINED _ _ _ STATIC
14
静的データ宣言。
IMAGE _ SYM クラス ENUM _ _ _ タグ
15
列挙型の tagname エントリ。
_ENUM の IMAGE SYM クラス _ _ _ _ メンバー
16
列挙型のメンバー。 [値] フィールドは、n 番目のメンバーを指定します。
IMAGE _ SYM _ クラスの REGISTER _ _ PARAM
17
レジスタ パラメーター。
IMAGE _ SYM _ クラス _ のビット _ フィールド
18
ビット フィールド参照。 [値] フィールドは、ビット フィールドの n 番目のビットを指定します。
IMAGE _ SYM _ クラス _ ブロック
100
.bb (ブロックの先頭) または .eb (ブロックの末尾) レコード。 [値] フィールドは、コードの場所の再配置可能なアドレスです。
IMAGE _ SYM _ クラス _ 関数
101
関数のエクステントを定義するシンボル レコードに対して Microsoft ツールが使用する値: begin 関数 (.bf)、終了関数 ( .ef)、および関数内の行 ( .lf )。 .lf レコードの場合、Value フィールドは関数内のソース行の数を示します。 .ef レコードの場合、Value フィールドは関数コードのサイズを示します。
IMAGE _ SYM _ クラス _ の _ _ 構造体の終了
102
構造体の終わりエントリ。
IMAGE _ SYM _ クラス _ ファイル
103
Microsoft ツールと従来の COFF 形式がソース ファイルシンボル レコードに使用する値。 シンボルの後に、ファイルに名前を付け、補助レコードが続きます。
IMAGE _ SYM _ クラス _ セクション
104
セクションの定義 (Microsoft ツールでは、代わりに STATIC ストレージ クラスが使用されます)。
IMAGE _ SYM クラス WEAK _ _ _ EXTERNAL
105
弱い外部。 詳細については、「補助形式 3: 脆弱な外部 」を参照してください
IMAGE _ SYM クラス CLR _ _ _ トークン
107
CLR トークン シンボル。 名前は、トークンの 16 進数の値で構成される ASCII 文字列です。 詳細については、「CLR トークン定義 (オブジェクトのみ)」を参照してください

補助シンボル レコード

補助シンボル テーブル レコードは常に、標準シンボル テーブル レコードに従って適用されます。 補助レコードには、ツールで認識できる任意の形式を使用できますが、シンボル テーブルを通常のサイズの配列として保持するには、18 バイトを割り当てる必要があります。 現在、Microsoft ツールは、関数定義、関数の開始記号と終了記号 (.bf と .ef)、脆弱な外部、ファイル名、セクション定義の各レコードの補助形式を認識しています。

従来の COFF 設計には、配列と構造体の補助レコード形式も含まれています。 Microsoft ツールではこれらを使用するのではなく、デバッグ セクションでデバッグVisual C++にシンボル情報を配置します。

補助書式 1: 関数の定義

シンボル テーブル レコードは、EXTERNAL (2) のストレージ クラス、関数 (0x20) を示す Type 値、および 0 より大きいセクション番号を持つ関数定義の先頭をマークします。 セクション番号 UNDEFINED (0) を持つシンボル テーブル レコードは関数を定義し、補助レコードを持たない点に注意してください。 関数定義シンボル レコードの後に、次に示す形式の補助レコードが続きます。

Offset サイズ フィールド 説明
0
4
TagIndex
対応する .bf (begin 関数) シンボル レコードのシンボル テーブル インデックス。
4
4
TotalSize
関数自体の実行可能コードのサイズ。 関数が独自のセクションにある場合、配置に関する考慮事項に応じて、セクション ヘッダーの SizeOfRawData は、このフィールド以上になります。
8
4
PointerToLinenumber
関数の最初の COFF 行番号エントリのファイル オフセット。存在しない場合は 0。 詳細については 、「COFF 行番号 (非推奨)」を参照してください
12
4
PointerToNextFunction
次の関数のレコードのシンボル テーブル インデックス。 関数がシンボル テーブルの最後の関数である場合、このフィールドは 0 に設定されます。
16
2
未使用

補助形式 2: .bf および .ef シンボル

シンボル テーブル内の関数定義ごとに、3 つの項目で行の開始、終了、および数が記述されます。 これらの各シンボルには、ストレージ クラス FUNCTION (101) があります。

.bf (begin 関数) という名前のシンボル レコード。 [値] フィールドは使用されません。

.lf という名前のシンボル レコード (関数内の行)。 [値] フィールドには、関数内の行数が示されます。

.ef (関数の末尾) という名前のシンボル レコード。 [値] フィールドの数値は、関数定義シンボル レコードの [合計サイズ] フィールドと同じです。

.bf および .ef シンボル レコード (.lf レコードではなく) の後に、次の形式の補助レコードが続きます。

Offset サイズ フィールド 説明
0
4
未使用
4
2
Linenumber
ソース ファイル内の実際の序数 (1、2、3 など) (.bf または .ef レコードに対応)。
6
6
未使用
12
4
ポインター Tonextfunction (. bf only)
次の bf シンボルレコードのシンボルテーブルインデックス。 関数がシンボルテーブルの最後の関数である場合、このフィールドは0に設定されます。 これは、. ef レコードには使用されません。
16
2
未使用

補助形式 3: 弱い外部型

"弱い外部性" は、リンク時の柔軟性を実現するオブジェクトファイルのメカニズムです。 モジュールには、未解決の外部シンボル (sym1) を含めることができますが、リンク時に sym1 が存在しない場合は、代わりに別の外部シンボル (sym2) を使用して参照を解決することを示す補助レコードを含めることもできます。

Sym1 の定義がリンクされている場合は、シンボルへの外部参照が正常に解決されます。 Sym1 の定義がリンクされていない場合は、sym1 の弱い外部に対するすべての参照が sym2 を参照します。 外部シンボル sym2 は、常にリンクされている必要があります。通常は、sym1 への弱い参照を含むモジュールで定義されています。

弱い外部参照は、外部ストレージクラスのシンボルテーブルレコード、UNDEF セクション番号、および0の値で表されます。 弱い外部シンボルレコードの後に、次の形式の補助レコードが続きます。

Offset サイズ フィールド 説明
0
4
TagIndex
Sym2 のシンボルテーブルインデックス。 sym1 が見つからない場合にリンクされるシンボル。
4
4
特性
IMAGE _ 弱 _ EXTERN SEARCH nolibrary の値は、 _ _ sym1 のライブラリ検索を実行する必要がないことを示します。
IMAGE _ WEAK EXTERN SEARCH library の値は、 _ _ _ sym1 のライブラリ検索を実行する必要があることを示します。
IMAGE _ WEAK EXTERN SEARCH エイリアスの値は、 _ _ _ sym1 が sym2 のエイリアスであることを示します。
8
10
未使用

[特性] フィールドは、WINNT では定義されていないことに注意してください。始め代わりに、[合計サイズ] フィールドが使用されます。

補助形式 4: ファイル

この形式は、ストレージクラスファイル (103) を含むシンボルテーブルレコードに従います。 シンボル名自体は、ファイルにする必要があります。その後に続く補助レコードは、ソースコードファイルの名前を示します。

Offset サイズ フィールド 説明
0
18
ファイル名
ソースファイルの名前を指定する ANSI 文字列。 最大長よりも小さい場合、null が埋め込まれます。

補助形式 5: セクション定義

この形式は、セクションを定義するシンボルテーブルのレコードに従います。 このようなレコードには、セクションの名前 (text や .drectve など) と、ストレージクラス STATIC (3) があるシンボル名があります。 補助レコードは、参照先のセクションに関する情報を提供します。 したがって、セクションヘッダー内の情報の一部が複製されます。

Offset サイズ フィールド 説明
0
4
長さ
セクションデータのサイズ。section ヘッダーの SizeOfRawData と同じです。
4
2
NumberOfRelocations
セクションの再配置エントリの数。
6
2
NumberOfLinenumbers
セクションの行番号エントリの数。
8
4
CheckSum
Communal データのチェックサム。 これは、 _ _ section ヘッダーで IMAGE SCN の LNK _ COMDAT フラグが設定されている場合に適用されます。 詳細については、「 COMDAT セクション (オブジェクトのみ)」を参照してください。
12
2
数値
関連するセクションのセクションテーブルの1から始まるインデックス。 これは、COMDAT 選択設定が5の場合に使用されます。
14
1
[選択]
COMDAT 選択番号。 これは、セクションが COMDAT セクションの場合に適用されます。
15
3
未使用

COMDAT セクション (オブジェクトのみ)

セクションが COMDAT セクションの場合は、セクション定義の補助形式の選択フィールドが適用されます。 COMDAT セクションは、複数のオブジェクトファイルで定義できるセクションです。 (フラグの画像 _SCN _ _ の LNK COMDAT は、セクションヘッダーの Flags フィールドで設定されます)。選択フィールドによって、COMDAT セクションの複数の定義をどのように解決するかが決定されます。

COMDAT セクションのセクション値を持つ最初のシンボルは、セクション記号である必要があります。 このシンボルには、セクションの名前、Value フィールドが0に等しいこと、該当する COMDAT セクションのセクション番号、IMAGE sym type NULL と等しい型フィールド、 _ _ _ イメージの sym クラス STATIC に等しいクラスフィールド、 _ _ _ および1つの補助レコードが含まれています。 2番目のシンボルは "COMDAT シンボル" と呼ばれ、選択フィールドと共にリンカーによって使用されます。

次に、選択フィールドの値を示します。

一定 説明
イメージの _ COMDAT _ 選択 _ NODUPLICATES
1
このシンボルが既に定義されている場合、リンカーは "多重定義されたシンボル" エラーを発行します。
イメージ _ COMDAT _ SELECT _ ANY
2
同じ COMDAT シンボルを定義するセクションをリンクすることができます。残りは削除されます。
イメージ _ COMDAT _ 選択 _ 同じ _ サイズ
3
リンカーは、このシンボルの定義の中で任意のセクションを選択します。 すべての定義が同じサイズでない場合は、"定義された文字の乗算" エラーが発生します。
イメージ _ COMDAT _ _ 完全 _ 一致を選択
4
リンカーは、このシンボルの定義の中で任意のセクションを選択します。 すべての定義が正確に一致しない場合は、"定義されたシンボルの乗算" エラーが発生します。
IMAGE _ COMDAT _ SELECT _ 連想
5
特定の他の COMDAT セクションがリンクされている場合、セクションはリンクされます。 この他のセクションは、セクション定義の補助シンボルレコードの数値フィールドによって示されます。 この設定は、複数のセクションにコンポーネント (たとえば、1つのコードや別のデータ内のデータ) を持つ定義に便利ですが、すべてをセットとしてリンクまたは破棄する必要があります。 このセクションに関連付けられているもう1つのセクションは、別の連想 COMDAT セクションである COMDAT セクションである必要があります。 連想 COMDAT セクションのセクションのアソシエーションチェーンでは、ループを形成できません。 セクションアソシエーションチェーンは、最終的には、IMAGE _ comdat SELECT 連想セットを持たない comdat セクションに送られる必要があり _ _ ます。
イメージ _ COMDAT _ 選択 _ 最大
6
リンカーは、このシンボルのすべての定義の中から最大の定義を選択します。 複数の定義がこのサイズの場合、それらの定義の選択は任意です。

CLR トークン定義 (オブジェクトのみ)

この補助記号は、通常、イメージの _ SYM _ クラス _ CLR トークンに従い _ ます。 これは、トークンを COFF シンボルテーブルの名前空間に関連付けるために使用されます。

Offset サイズ フィールド 説明
0
1
bAuxType
イメージ _ AUX _ シンボル _ 型 _ トークン _ DEF (1) である必要があります。
1
1
提供
予約済み。0にする必要があります。
2
4
シンボル Tableindex
この CLR トークン定義が参照する COFF シンボルのシンボルインデックス。
6
12
予約済み。0にする必要があります。

COFF 文字列テーブル

COFF シンボルテーブルの直後には、COFF 文字列テーブルがあります。 このテーブルの位置は、COFF ヘッダーのシンボルテーブルアドレスを取得し、シンボルのサイズを乗算したシンボルの数を加算することによって検出されます。

COFF 文字列テーブルの先頭には、文字列テーブルの残りの部分の合計サイズ (バイト単位) を格納する4バイトが含まれます。 このサイズにはサイズフィールド自体が含まれているため、文字列が存在しない場合は、この場所の値は4になります。

このサイズに従うと、COFF シンボルテーブル内のシンボルによってポイントされる null で終わる文字列になります。

属性証明書テーブル (イメージのみ)

属性証明書は、属性証明書テーブルを追加することによってイメージに関連付けることができます。 属性証明書テーブルは、一連の連続した quadword 属性証明書エントリで構成されています。 この配置を実現するために、ファイルの元の末尾と属性証明書テーブルの先頭の間にゼロの埋め込みが挿入されます。 各属性証明書エントリには、次のフィールドが含まれています。

Offset サイズ フィールド 説明
0
4
dwLength
属性証明書エントリの長さを指定します。
4
2
wRevision
証明書のバージョン番号が含まれます。 詳細については、次のテキストを参照してください。
6
2
wCertificateType
BCertificate のコンテンツの種類を指定します。 詳細については、次のテキストを参照してください。
8
参考資料
bCertificate
Authenticode 署名などの証明書が含まれています。 詳細については、次のテキストを参照してください。

省略可能なヘッダーデータディレクトリの証明書テーブルエントリの仮想アドレス値は、最初の属性証明書エントリへのファイルオフセットです。 後続のエントリにアクセスするには、現在の属性証明書エントリの先頭から8バイトの倍数に切り上げて、そのエントリの dwLength バイトを進めます。 これは、丸められた dwLength 値の合計が、省略可能なヘッダーデータディレクトリの Certificates テーブルエントリのサイズ値と等しいまで続きます。 丸められた dwLength 値の合計がサイズ値と等しくない場合は、属性証明書テーブルまたはサイズフィールドのいずれかが破損しています。

たとえば、省略可能なヘッダーデータディレクトリの証明書テーブルエントリに次のものが含まれているとします。

virtual address = 0x5000
size = 0x1000

最初の証明書は、ディスク上のファイルの先頭からオフセット0x5000 で開始されます。 すべての属性証明書エントリを進めるには、次の手順を実行します。

  1. 最初の属性証明書の dwLength 値を開始オフセットに追加します。
  2. 手順 1. の値を最も近い8バイトの倍数に丸めると、2番目の属性証明書エントリのオフセットが検索されます。
  3. 手順 2. のオフセット値を2番目の属性証明書エントリの dwLength 値に追加し、最も近い8バイトの倍数に切り上げて、3番目の属性証明書エントリのオフセットを決定します。
  4. 計算されたオフセットが 0x6000 (0x5000 start + 0x1000 total size) になるまで、連続した各証明書に対して手順 3. を繰り返します。これは、テーブル全体をウォークしたことを示します。

または、ループで Win32 ImageEnumerateCertificates 関数を呼び出して、証明書のエントリを列挙することもできます。 関数の参照ページへのリンクについては、「 参照」を参照してください。

属性証明書テーブルエントリには、エントリに正しい dwLength 値、一意の wRevision 値、および一意の wCertificateType 値がある限り、任意の証明書の種類を含めることができます。 最も一般的な種類の証明書テーブルエントリは、WIN _ 証明書構造体です。これについては、このセクションの残りの部分で説明します。

WIN _ CERTIFICATE wrevision メンバーのオプションには、次のものが含まれます (ただし、これらに限定されません)。

名前 Notes
0x0100
WIN _ CERT _ REVISION _ 1 _ 0
バージョン1、Win _ 証明書構造のレガシバージョン。 これは、従来の Authenticode 署名を確認する目的でのみサポートされています。
0x0200
WIN _ CERT _ REVISION _ 2 _ 0
バージョン2は、Win 証明書構造の現在のバージョンです _ 。

WIN _ CERTIFICATE Wcertificatetype メンバーのオプションには、次の表の項目が含まれます (ただし、これらに限定されません)。 一部の値は現在サポートされていないことに注意してください。

名前 Notes
0x0001
WIN _ 証明書の _ 種類 _ X509
bCertificate には x.509 証明書が含まれています
サポートされていません
0x0002
WIN _ CERT _ TYPE _ PKCS _ SIGNED _ DATA
bCertificate には PKCS # 7 の SignedData 構造体が含まれています
0x0003
WIN _ CERT _ TYPE _ RESERVED _ 1
予約されています。
0x0004
WIN _ CERT _ TYPE _ TS _ STACK _ SIGNED
ターミナルサーバープロトコルスタック証明書の署名
サポートされていません

WIN _ 証明書構造体の bcertificate メンバーには、 wcertificatetype によって指定されたコンテンツタイプを持つ可変長バイト配列が含まれています。 Authenticode でサポートされている型は、WIN _ CERT _ type _ pkcs _ SIGNED _ Data (pkcs # 7 signeddata 構造) です。 authenticode デジタル署名形式の詳細については、「 authenticode 移植可能な実行可能ファイルの署名形式の Windows」を参照してください。

Bcertificate の内容が quadword の境界で終了しない場合、属性証明書のエントリには、 bcertificate の最後から次の quadword 境界までのゼロが埋め込まれます。

Dwlength 値は、完了した WIN 証明書構造の長さで、 _ 次のように計算されます。

dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)

この長さには、各 WIN _ 証明書構造が quadword に調整されるという要件を満たすために使用される埋め込みのサイズが含まれている必要があります。

dwLength += (8 - (dwLength & 7)) & 7;

省略可能なヘッダーデータディレクトリCertificates テーブル エントリで指定されている 証明書テーブルのサイズ(画像のみ)-埋め込みが含まれます。

Imagehlp.dll API を使用して PE ファイルから証明書を列挙、追加、および削除する方法の詳細については、「 Imagehlp.dll 関数」を参照してください。

証明書データ

前のセクションで説明したように、"属性証明書" テーブルの証明書には、任意の証明書の種類を含めることができます。 PE ファイルの整合性を保証する証明書には、PE イメージハッシュを含めることができます。

PE イメージハッシュ (またはファイルハッシュ) はファイルチェックサムに似ています。ハッシュアルゴリズムによって、ファイルの整合性に関連するメッセージダイジェストが生成されます。 ただし、チェックサムは単純なアルゴリズムによって生成され、主にディスク上のメモリブロックが不良であるかどうかを検出し、そこに格納されている値が破損しているかどうかを検出するために使用されます。 ファイルハッシュは、ファイルの破損も検出するという点で、チェックサムに似ています。 ただし、ほとんどのチェックサムアルゴリズムとは異なり、元の変更されていない値からファイルハッシュを変更することなくファイルを変更することは非常に困難です。 このため、ファイルハッシュを使用して、ウイルス、ハッカー、またはトロイの木馬プログラムによって導入されたファイルなど、意図的かつ微妙な変更を検出することができます。

イメージダイジェストは、証明書に含まれている場合、PE イメージ内の特定のフィールドを除外する必要があります。たとえば、オプションのヘッダーデータディレクトリのチェックサムと証明書のテーブルエントリです。 これは、証明書を追加する操作によってこれらのフィールドが変更され、異なるハッシュ値が計算されるためです。

Win32 ImageGetDigestStream 関数は、ターゲット PE ファイルから、関数をハッシュするためのデータストリームを提供します。 このデータストリームは、PE ファイルに証明書を追加したり、PE ファイルから削除したりしても、一貫性が維持されます。 ImageGetDigestStream に渡されるパラメーターに基づいて、PE イメージの他のデータをハッシュ計算から除外することができます。 関数の参照ページへのリンクについては、「 参照」を参照してください。

テーブルのインポート Delay-Load (イメージのみ)

これらのテーブルは、dll への最初の呼び出しまで DLL の読み込みを遅延させることができるように、イメージに追加されました。 テーブルのレイアウトは、セクション6.4 の「 idata」セクションで説明されている従来のインポートテーブルのレイアウトと一致します。 ここでは、いくつかの詳細についてのみ説明します。

Delay-Load Directory テーブル

遅延読み込みディレクトリテーブルは、import directory テーブルに相当します。 これは、省略可能なヘッダーデータディレクトリの一覧 (オフセット 200) の遅延インポート記述子のエントリを使用して取得できます。 テーブルは次のように配置されます。

Offset サイズ フィールド 説明
0
4
属性
ゼロを指定してください。
4
4
名前
読み込む DLL の名前の RVA です。 名前は、イメージの読み取り専用データセクションに存在します。
8
4
モジュールハンドル
遅延読み込みの対象となる DLL のモジュールハンドル (イメージのデータセクション内) の RVA。 遅延読み込みを管理するために提供されるルーチンによってストレージに使用されます。
12
4
遅延インポートアドレステーブル
遅延読み込みのインポートアドレステーブルの RVA。 詳細については、「 遅延インポートアドレステーブル (IAT)」を参照してください。
16
4
インポート名の遅延テーブル
読み込みが必要な可能性のあるインポートの名前を含む、遅延読み込み名前テーブルの RVA。 これは、インポート名テーブルのレイアウトと一致します。 詳細については、「 ヒント/名前テーブル」を参照してください。
20
4
バインド遅延インポートテーブル
バインドされた遅延読み込みアドレステーブルの RVA (存在する場合)。
24
4
アンロード遅延インポートテーブル
アンロード遅延読み込みアドレステーブルの RVA (存在する場合)。 これは、遅延インポートアドレステーブルの正確なコピーです。 呼び出し元が DLL をアンロードする場合は、後続の DLL の呼び出しが引き続き、サンク機構を正しく使用するように、遅延インポートアドレステーブルにこのテーブルをコピーします。
28
4
タイム スタンプ
このイメージがバインドされている DLL のタイムスタンプ。

このデータ構造で参照されているテーブルは、対応するものと同じように整理および並べ替えられています。 詳細については、「 idata」セクションを参照してください。

属性

ただし、属性フラグは定義されていません。 リンカーは、イメージ内でこのフィールドを 0 に設定します。 このフィールドは、新しいフィールドの存在を示してレコードを拡張するために使用できます。また、遅延ヘルパー関数またはアンロード ヘルパー関数の動作を示すために使用することもできます。

名前

遅延読み込みされる DLL の名前は、イメージの読み取り専用データ セクションに存在します。 szName フィールドを介して参照されます。

モジュール ハンドル

遅延読み込みされる DLL のハンドルは、イメージの data セクションに含まれます。 phmod フィールドはハンドルをポイントします。 指定された遅延読み込みヘルパーは、この場所を使用して、読み込まれた DLL にハンドルを格納します。

遅延インポート アドレス テーブル

遅延インポート アドレス テーブル (IAT) は、pIAT フィールドを介して遅延インポート記述子によって参照されます。 遅延読み込みヘルパーは、これらのポインターを実際のエントリ ポイントで更新して、サンクが呼び出し元ループに入らなくなった状態にします。 関数ポインターには、 式 を使用してアクセスします pINT->u1.Function

遅延インポート名テーブル

遅延インポート名テーブル (INT) には、読み込みが必要になる可能性があるインポートの名前が含まれている。 これらは、IAT の関数ポインターと同じ方法で順序付けされます。 これらは標準の INT と同じ構造で構成され、 式 を使用してアクセスされます pINT->u1.AddressOfData->Name[0]

遅延バインドインポート アドレス テーブルとタイム スタンプ

遅延バインド インポート アドレス テーブル (BIAT) は、プロセス後のバインド フェーズによって遅延読み込みディレクトリ テーブルのタイムスタンプ フィールドと共に使用される IMAGE _ の THUNK DATA 項目の省略可能なテーブルです。 _

遅延アンロードインポート アドレス テーブル

遅延アンロード インポート アドレス テーブル (UIAT) は、明示的なアンロード要求を処理するためにアンロード コードが使用する IMAGE の THUNK DATA 項目の省略可能 _ _ なテーブルです。 これは、読み取り専用セクションの初期化されたデータで構成されます。これは、コードを遅延読み込みサンクに参照した元の IAT の正確なコピーです。 アンロード要求では、ライブラリを解放し、phmod をクリアし、IAT で書き込まれた UIAT を使用して、すべてをプリロード状態 * に復元できます。

特別なセクション

一般的な COFF セクションには、リンカーと Microsoft Win32 ローダーで処理されるコードまたはデータが含まれており、セクションの内容に関する特別な知識はありません。 コンテンツは、リンクまたは実行されているアプリケーションにのみ関連します。

ただし、一部の COFF セクションは、オブジェクト ファイルまたはイメージ ファイルで見つかった場合に特別な意味を持ちます。 ツールとローダーは、これらのセクションを認識します。これは、セクション ヘッダーに特別なフラグが設定されている、イメージの省略可能なヘッダー内の特別な場所がそれらを指している、またはセクション名自体がセクションの特殊な機能を示すためです。 (セクション名自体がセクションの特殊な関数を示していない場合でも、セクション名は規則によって指定されます。したがって、この仕様の作成者は、すべてのケースでセクション名を参照できます)。

予約済みのセクションとその属性を次の表に示します。その後、実行可能ファイルに永続化されるセクションの種類と、拡張機能のメタデータを含むセクション型の詳細な説明を示します。

セクション名 Content 特性
.bss
初期化されていないデータ (自由形式)
イメージ _ SCN _ CNT _ 初期化されていないデータ イメージ _ | SCN MEM 読み取 _ _ _ | りイメージ _ SCN _ MEM 書き込 _ み
.cormeta
オブジェクト ファイルにマネージド コードが含まれているかどうかを示す CLR メタデータ
IMAGE _ SCN _ LNK _ INFO
.data
初期化されたデータ (自由形式)
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ 書き込 _ み
.debug$F
生成された FPO デバッグ情報 (オブジェクトのみ、x86 アーキテクチャのみ、現在は古い)
イメージ _ SCN _ CNT _ 初期化 _ データ イメージ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ _ 破棄可能
.debug$P
プリコンパイル済みデバッグの種類 (オブジェクトのみ)
イメージ _ SCN _ CNT _ 初期化 _ データ イメージ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ _ 破棄可能
.debug$S
デバッグ シンボル (オブジェクトのみ)
イメージ _ SCN _ CNT _ 初期化 _ データ イメージ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ _ 破棄可能
.debug$T
デバッグの種類 (オブジェクトのみ)
イメージ _ SCN _ CNT _ 初期化 _ データ イメージ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ _ 破棄可能
.drective
リンカー オプション
IMAGE _ SCN _ LNK _ INFO
.edata
テーブルのエクスポート
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ | _ SCN MEM 読み _ _ 取り
.idata
テーブルのインポート
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ 書き込 _ み
.idlsym
IDL 属性をサポートする登録済みの SEH (イメージのみ) が含まれています。 詳細については、このトピックの最後の「参照 の「IDL 属性」を参照してください。
IMAGE _ SCN _ LNK _ INFO
.pdata
例外情報
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ | _ SCN MEM 読み _ _ 取り
.rdata
読み取り専用の初期化データ
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ | _ SCN MEM 読み _ _ 取り
.reloc
画像の再配置
イメージ _ SCN _ CNT _ 初期化 _ データ イメージ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ _ 破棄可能
.rsrc
リソース ディレクトリ
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ | _ SCN MEM 読み _ _ 取り
.sbss
GP 相対初期化されていないデータ (自由形式)
IMAGE _ SCN _ CNT _ UNINITIALIZED _ DATA IMAGE | _ _ SCN MEM READ IMAGE _ | _ _ SCN MEM WRITE IMAGE _ | _ SCN _ GPREL IMAGE _ SCN GPREL フラグは _ 、IA64 アーキテクチャにのみ設定する必要があります。このフラグは、他のアーキテクチャでは有効ではありません。 IMAGE SCN GPREL フラグはオブジェクト ファイル専用です。このセクションの種類がイメージ ファイルに含まれる場合 _ _ 、IMAGE _ SCN GPREL フラグを _ 設定することはできません。
.sdata
GP 相対初期化データ (自由形式)
IMAGE SCN CNT 初期化データ イメージ _ _ _ _ | _ _ SCN MEM _ READ IMAGE | _ SCN _ MEM WRITE _ IMAGE | _ SCN _ GPREL: IMAGE SCN GPREL フラグは _ _ 、IA64 アーキテクチャにのみ設定する必要があります。このフラグは、他のアーキテクチャでは有効ではありません。 IMAGE SCN GPREL フラグはオブジェクト ファイル専用です。このセクションの種類がイメージ ファイルに含まれる場合 _ _ 、IMAGE _ SCN GPREL フラグを _ 設定することはできません。
.srdata
GP 相対読み取り専用データ (自由形式)
IMAGE _ SCN _ CNT _ 初期化 _ データ イメージ | _ _ SCN MEM READ IMAGE _ | _ SCN _ GPREL: IMAGE SCN GPREL フラグは _ _ 、IA64 アーキテクチャに対してのみ設定する必要があります。このフラグは、他のアーキテクチャでは有効ではありません。 IMAGE SCN GPREL フラグはオブジェクト ファイル専用です。このセクションの種類がイメージ ファイルに含まれる場合 _ _ 、IMAGE _ SCN GPREL フラグを _ 設定することはできません。
.sxdata
登録済みの例外ハンドラー データ (自由形式および x86/オブジェクトのみ)
IMAGE SCN LNK INFO オブジェクト ファイル内のコードによって参照される各例外ハンドラーのシンボル インデックス _ _ _ が含まれている。 シンボルは、UNDEF シンボルまたはそのモジュールで定義されているシンボルに使用できます。
.text
実行可能コード (自由形式)
イメージ _ SCN _ CNT _ コード イメージ | _ SCN MEM EXECUTE _ _ | IIMAGE _ SCN MEM _ _ READ
.tls
スレッド ローカル ストレージ (オブジェクトのみ)
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ 書き込 _ み
.tls$
スレッド ローカル ストレージ (オブジェクトのみ)
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ 書き込 _ み
.vsdata
GP 相対初期化データ (FREE 形式、ARM、SH4、Thumb アーキテクチャのみ)
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ SCN MEM 読み取 | _ _ _ | りイメージ _ SCN MEM _ 書き込 _ み
.xdata
例外情報 (自由形式)
イメージ _ SCN _ CNT 初期化 _ データ イメージ _ | _ SCN MEM 読み _ _ 取り

ここに示すセクションの一部は、オブジェクト ファイルまたはイメージ ファイルにのみ関連する特殊なセマンティクスを示すために、それぞれ "オブジェクトのみ" または "イメージのみ" とマークされています。 "image only" とマークされているセクションは、イメージ ファイルに取り込む方法としてオブジェクト ファイルに引き続き表示される場合がありますが、そのセクションにはリンカーに対する特別な意味はありません。これはイメージ ファイル ローダーに対してのみです。

.debug セクション

.debug セクションは、コンパイラによって生成されたデバッグ情報を含むオブジェクト ファイルと、生成されたデバッグ情報を含むイメージ ファイルで使用されます。 このセクションでは、オブジェクト ファイルとイメージ ファイル内のデバッグ情報のパッケージ化について説明します。

次のセクションでは、デバッグ ディレクトリの形式について説明します。この形式はイメージ内の任意の場所に設定できます。 以降のセクションでは、デバッグ情報を含むオブジェクト ファイル内の "グループ" について説明します。

リンカーの既定値は、デバッグ情報がイメージのアドレス空間にマップされないという設定です。 .debug セクションは、アドレス空間にデバッグ情報がマップされている場合にのみ存在します。

デバッグ ディレクトリ (イメージのみ)

イメージ ファイルには、デバッグ情報の形式と場所を示すオプションのデバッグ ディレクトリが含まれます。 このディレクトリは、場所とサイズがイメージの省略可能なヘッダーに示されているデバッグ ディレクトリ エントリの配列で構成されます。

デバッグ ディレクトリは破棄可能な .debug セクション (存在する場合) にするか、イメージ ファイルの他のセクションに含め、セクションに含めません。

各デバッグ ディレクトリ エントリは、デバッグ情報のブロックの場所とサイズを識別します。 デバッグ情報がセクション ヘッダーでカバーされていない (つまり、イメージ ファイルに存在し、実行時のアドレス空間にマップされていない) 場合、指定された RVA は 0 にできます。 マップされている場合、RVA はアドレスです。

デバッグ ディレクトリ エントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
特性
予約済み。 は 0 である必要があります。
4
4
TimeDateStamp
デバッグ データが作成された日時。
8
2
MajorVersion
デバッグ データ形式のメジャー バージョン番号。
10
2
MinorVersion
デバッグ データ形式のマイナー バージョン番号。
12
4
Type
デバッグ情報の形式。 このフィールドを使用すると、複数のデバッガーをサポートできます。 詳細については、「デバッグの種類」 を参照してください
16
4
SizeOfData
デバッグ データのサイズ (デバッグ ディレクトリ自体は含め)。
20
4
AddressOfRawData
読み込まれた場合のデバッグ データのアドレス。イメージ ベースを基準にした相対値です。
24
4
ポインター Torawdata
デバッグデータへのファイルポインター。

デバッグの種類

Debug directory エントリの Type フィールドには、次の値が定義されています。

一定 説明
イメージ _ デバッグの _ 種類が _ 不明です
0
すべてのツールによって無視される不明な値。
イメージ _ デバッグ _ 型 _ COFF
1
COFF デバッグ情報 (行番号、シンボル テーブル、および文字列テーブル)。 この種のデバッグ情報はまた、ファイル ヘッダー内のフィールドによって指し示されます。
イメージ _ デバッグ _ 型 _ CODEVIEW
2
Visual C++ デバッグ情報。
イメージ _ デバッグの _ 種類 _ FPO
3
フレームポインターの省略 (FPO) 情報。 この情報は、非標準のスタックフレームを解釈する方法をデバッガーに指示します。これは、フレームポインター以外の目的で EBP レジスタを使用します。
イメージ _ デバッグの種類のその _ _ 他
4
DBG ファイルの場所。
イメージ _ デバッグの _ 種類の _ 例外
5
Pdata セクションのコピー。
イメージ _ デバッグ _ 型の _ 修正
6
予約済み。
イメージ _ デバッグ _ 型 _ OMAP _ FROM _ SRC
7
イメージ内の RVA からソースイメージ内の RVA へのマッピング。
イメージ _ デバッグ _ _ の種類 ( _ SRC からの OMAP) _
8
ソースイメージ内の RVA からイメージ内の RVA へのマッピング。
イメージ _ デバッグの _ 種類 _ BORLAND
9
Borland 用に予約されています。
イメージ _ デバッグの _ 種類 _ RESERVED10
10
予約済み。
イメージ _ デバッグ _ 型 _ CLSID
11
予約済み。
イメージ _ デバッグの _ 種類の _ 再現
16
PE の決定性または再現性。
イメージ _ デバッグ _ 型 _ EX _ DLLCHARACTERISTICS 特性 20 拡張 DLL の特性ビット。

Type フィールドが IMAGE DEBUG Type FPO に設定されている場合 _ _ _ 、デバッグ生データは、各メンバーが関数のスタックフレームを示す配列になります。 デバッグの種類が FPO の場合でも、イメージファイル内のすべての関数には、FPO 情報が定義されている必要はありません。 FPO 情報を持たない関数には、通常のスタックフレームがあることが前提となっています。 FPO 情報の形式は次のとおりです。

#define FRAME_FPO   0               
#define FRAME_TRAP  1
#define FRAME_TSS   2
               
typedef struct _FPO_DATA {
    DWORD       ulOffStart;            // offset 1st byte of function code
    DWORD       cbProcSize;            // # bytes in function
    DWORD       cdwLocals;             // # bytes in locals/4
    WORD        cdwParams;             // # bytes in params/4
    WORD        cbProlog : 8;          // # bytes in prolog
    WORD        cbRegs   : 3;          // # regs saved
    WORD        fHasSEH  : 1;          // TRUE if SEH in func
    WORD        fUseBP   : 1;          // TRUE if EBP has been allocated
    WORD        reserved : 1;          // reserved for future use
    WORD        cbFrame  : 2;          // frame type
} FPO_DATA;

種類が IMAGE デバッグ型のエントリが存在する場合は、 _ _ _ その PE ファイルが決定性や再現性を実現するために構築されていることを示します。 入力が変更されない場合、PE が生成されるタイミングや場所に関係なく、出力 PE ファイルはビットごとに同一であることが保証されます。 Pe ファイル内のさまざまな日付/時刻スタンプフィールドは、入力として PE ファイルの内容を使用する計算されるハッシュ値の一部またはすべてのビットで埋められます。したがって、pe ファイルまたは PE 内の関連する特定のデータが生成された実際の日時を表すことはできません。 このデバッグエントリの生データは空でもかまいません。また、ハッシュ値の長さを表す4バイト値の前に計算されたハッシュ値が含まれている場合もあります。

Type フィールドが IMAGE _ DEBUG _ type EX dllcharacteristics 特性に設定されている場合 _ _ 、デバッグの生データには、イメージの省略可能なヘッダーで設定できる拡張 DLL 特性ビットが含まれます。 「オプションのヘッダー Windows-Specific フィールド (イメージのみ)」の「 DLL の特性」を参照してください。

拡張 DLL の特性

拡張 DLL 特性ビットに対しては、次の値が定義されます。

一定 説明
イメージ _ DLLCHARACTERISTICS _ EX の _ 中央 _ 互換性 0x0001 イメージは、中央と互換性があります。

. debug $ F (オブジェクトのみ)

このセクションのデータは Visual C++ バージョン7.0 以降で置き換えられました。これは、 . debug $ S サブセクションに出力されるより広範なデータセットによって行われています。

オブジェクトファイルには、を含めることができます。内容が1つ以上の FPO _ データレコード (フレームポインターの省略情報) である $ F セクションをデバッグします。 「 _ _ _ デバッグの種類」の「イメージデバッグの種類 FPO」を参照してください。

リンカーは、これらの . debug $ F レコードを認識します。 デバッグ情報が生成されている場合、リンカーは、 _ プロシージャ RVA によって FPO データレコードを並べ替え、デバッグディレクトリエントリを生成します。

コンパイラは、標準のフレーム形式を持つプロシージャの FPO レコードを生成しません。

. debug $ S (オブジェクトのみ)

このセクションには Visual C++ のデバッグ情報 (シンボリック情報) が含まれています。

. debug $ P (オブジェクトのみ)

このセクションには Visual C++ のデバッグ情報 (プリコンパイル済み情報) が含まれています。 これらは、このオブジェクトを使用して生成されたプリコンパイル済みヘッダーを使用してコンパイルされたすべてのオブジェクト間で共有される型です。

. debug $ T (オブジェクトのみ)

このセクションには Visual C++ のデバッグ情報 (型情報) が含まれています。

リンカーによる Microsoft デバッグ情報のサポート

デバッグ情報をサポートするために、リンカーは次のようになります。

  • すべての関連するデバッグデータを、 . debug $ Fdebug $ S. debug $ P、および. debug $ T セクションから収集します。

  • リンカーによって生成されたデバッグ情報と共に、そのデータを PDB ファイルに処理し、デバッグディレクトリエントリを作成して参照します。

.Drectve セクション (オブジェクトのみ)

セクションヘッダーに "IMAGE SCN LNK INFO" フラグが設定されてい _ _ て、 _ .drectve セクションの名前が付いている場合、セクションはディレクティブセクションです。 リンカーは情報の処理後に .drectve セクションを削除するため、リンクされているイメージファイルにはセクションが表示されません。

.Drectve セクションは、ANSI または UTF-8 としてエンコードできるテキストの文字列で構成さ れます。 UTF-8 バイト順マーカー (1 つの BOM、0xEF、0Xef、および0Xef で構成される3バイトのプレフィックス) が存在しない場合、ディレクティブ文字列は ANSI として解釈されます。 ディレクティブ文字列は、スペースで区切られた一連のリンカーオプションです。 各オプションには、ハイフン、オプション名、および適切な属性が含まれています。 オプションに空白が含まれている場合は、オプションを引用符で囲む必要があります。 .Drectve セクションには、再配置または行番号を指定できません。

... [...] セクション (イメージのみ)

[データのエクスポート] セクションには、"データ" という名前を付けます。これには、他のイメージが動的リンクを介してアクセスできるシンボルに関する情報が含まれます。 通常、エクスポートされたシンボルは Dll にありますが、Dll もシンボルをインポートできます。

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

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

別のイメージ ファイルが名前でシンボルをインポートすると、Win32 ローダーは名前ポインター テーブルで一致する文字列を検索します。 一致する文字列が見つかった場合、関連する序数は、序数テーブル内の対応するメンバー (つまり、名前ポインター テーブルで見つかった文字列ポインターと同じインデックスを持つ序数テーブルのメンバー) を検索することで識別されます。 結果として得られる序数は、エクスポート アドレス テーブルへのインデックスで、目的のシンボルの実際の位置を示します。 すべてのエクスポート シンボルには、序数でアクセスできます。

別のイメージ ファイルが序数でシンボルをインポートする場合は、名前ポインター テーブルで一致する文字列を検索する必要があります。 したがって、序数を直接使用する方が効率的です。 ただし、エクスポート名は覚えやすく、ユーザーがシンボルのテーブル インデックスを知る必要が生じりません。

ディレクトリ テーブルのエクスポート

シンボルのエクスポート情報は、エクスポート シンボル情報の残りの部分を記述するエクスポート ディレクトリ テーブルで始まります。 エクスポート ディレクトリ テーブルには、このイメージ内のエントリ ポイントへのインポートを解決するために使用されるアドレス情報が含まれます。

Offset サイズ フィールド 説明
0
4
エクスポート フラグ
予約済み。 は 0 である必要があります。
4
4
Time/Date スタンプ
エクスポート データが作成された日時。
8
2
メジャー バージョン
メジャー バージョン番号。 メジャー バージョン番号とマイナー バージョン番号は、ユーザーが設定できます。
10
2
マイナー バージョン
マイナー バージョン番号。
12
4
RVA という名前を付け
DLL の名前を含む ASCII 文字列のアドレス。 このアドレスは、イメージ ベースに対する相対アドレスです。
16
4
序数ベース
このイメージ内のエクスポートの開始序数。 このフィールドは、エクスポート アドレス テーブルの開始序数を指定します。 通常は 1 に設定されます。
20
4
アドレス テーブルエントリ
エクスポート アドレス テーブル内のエントリの数。
24
4
名前ポインターの数
名前ポインター テーブル内のエントリの数。 これは、序数テーブル内のエントリの数です。
28
4
アドレス テーブル RVA のエクスポート
イメージ ベースに対する相対エクスポート アドレス テーブルのアドレス。
32
4
Name Pointer RVA
エクスポート名ポインター テーブルのアドレス。イメージ ベースを基準にした相対値です。 テーブル のサイズは、[Number of Name Pointers]/(名前ポインターの数)フィールドによって指定されます。
36
4
序数テーブル RVA
イメージ ベースを基準にした序数テーブルのアドレス。

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

エクスポート アドレス テーブルには、エクスポートされたエントリ ポイントのアドレスとエクスポートされたデータと絶対値が含まれる。 序数は、エクスポート アドレス テーブルへのインデックスとして使用されます。

エクスポート アドレス テーブルの各エントリは、次の表の 2 つの形式のいずれかを使用するフィールドです。 指定されたアドレスがエクスポート セクション内に存在しない場合 (省略可能なヘッダーに示されているアドレスと長さによって定義されます)、フィールドはエクスポート RVA です。これは、コードまたはデータの実際のアドレスです。 それ以外の場合、フィールドは、別の DLL 内のシンボルに名前を付け、転送者 RVA です。

Offset サイズ フィールド 説明
0
4
RVA のエクスポート
メモリに読み込まれたときにエクスポートされるシンボルのアドレス。イメージ ベースを基準にした相対値です。 たとえば、エクスポートされた関数のアドレスなどです。
0
4
フォワーダーの RVA
Export セクション内の null で終わる ASCII 文字列へのポインター。 この文字列は、export table data directory エントリによって指定された範囲内である必要があります。 「 オプションのヘッダーデータディレクトリ (イメージのみ)」を参照してください。 この文字列は、DLL の名前とエクスポートの名前 ("MYDLL.DLL" など)、または DLL 名とエクスポートの序数 (たとえば、"MYDLL.DLL") を指定します。 #27 ")。

フォワーダー RVA は、他のイメージから定義をエクスポートし、現在のイメージによってエクスポートされているかのように表示します。 このため、シンボルは同時にインポートおよびエクスポートされます。

たとえば、Windows XP の Kernel32.dll では、"HeapAlloc" という名前のエクスポートが文字列 "NTDLL" に転送されます。RtlAllocateHeap。 " これにより、アプリケーションは、実際にインポート参照を含むことなく、Windows XP 固有のモジュール Ntdll.dll を使用できるようになります。 アプリケーションのインポートテーブルは、Kernel32.dll のみを参照します。 このため、アプリケーションは Windows XP に固有のものではなく、任意の Win32 システム上で実行できます。

エクスポート名ポインターテーブル

エクスポート名ポインターテーブルは、エクスポート名テーブルのアドレス (RVAs) の配列です。 ポインターはそれぞれ32ビットであり、イメージベースを基準としています。 ポインターは、バイナリ検索を可能にするために、構文的に並べ替えられます。

エクスポート名は、エクスポート名ポインターテーブルにポインターが含まれている場合にのみ定義されます。

序数テーブルのエクスポート

エクスポート序数テーブルは、16ビットのバイアスを持たないインデックスの配列であり、エクスポートアドレステーブルに格納されます。 序数は、export directory テーブルの序数の基本フィールドによってバイアスされます。 つまり、エクスポートアドレステーブルに真のインデックスを取得するには、序数ベースを序数から減算する必要があります。

エクスポート名ポインターテーブルとエクスポート序数テーブルは、自然なフィールドの配置を可能にするために分離された2つの並列配列を形成します。 この2つのテーブルは、実質的には1つのテーブルとして機能します。このテーブルでは、エクスポート名のポインター列がパブリック (エクスポートされた) 名を指し、エクスポート序数の列によって、そのパブリック名に対応する序数が示されます。 エクスポート名ポインターテーブルのメンバーと、エクスポート序数テーブルのメンバーは、それぞれの配列で同じ位置 (インデックス) を持つことによって関連付けられます。

したがって、エクスポート名ポインターテーブルを検索し、一致する文字列が位置 i で見つかった場合、シンボルの RVA とバイアスをかける序数を検索するアルゴリズムは次のようになります。

i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];

rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;

(バイアスをかける) 序数でシンボルを検索する場合、シンボルの RVA と名前を検索するためのアルゴリズムは次のとおりです。

ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);

rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];

名前テーブルのエクスポート

"エクスポート名" テーブルには、エクスポート名ポインターテーブルによってポイントされた実際の文字列データが含まれています。 このテーブル内の文字列は、他のイメージがシンボルをインポートするために使用できるパブリック名です。 これらのパブリックエクスポート名は、シンボルが独自のイメージファイルとソースコードに含まれるプライベートシンボル名と必ずしも同じであるとは限りませんが、でもかまいません。

エクスポートされたすべてのシンボルには、エクスポートアドレステーブルのインデックスだけである序数値があります。 ただし、エクスポート名の使用は省略可能です。 エクスポートされたシンボルには、エクスポート名を含めることができます。 エクスポート名を持つエクスポートシンボルの場合は、エクスポート名ポインターテーブルとエクスポート序数テーブル内の対応するエントリが連携して、各名前が序数に関連付けられます。

エクスポート名テーブルの構造は、可変長の一連の null で終わる ASCII 文字列です。

. Idata セクション

実質的にすべての実行可能 (EXE) ファイルを含む、シンボルをインポートするすべてのイメージファイルには、idata セクションがあります。 インポート情報の一般的なファイルレイアウトは次のとおりです。

  • ディレクトリテーブル

    Null ディレクトリエントリ

  • DLL1 インポートルックアップテーブル

    [Null]

  • DLL2 インポートルックアップテーブル

    [Null]

  • DLL3 インポートルックアップテーブル

    [Null]

  • Hint-Name テーブル

ディレクトリテーブルのインポート

インポート情報は、import directory テーブルから始まります。このテーブルには、インポート情報の残りの部分が記述されています。 Import directory テーブルには、DLL イメージ内のエントリポイントへの修正参照を解決するために使用されるアドレス情報が含まれています。 Import directory テーブルは、インポートディレクトリエントリの配列で構成されます。これには、イメージが参照する各 DLL のエントリが1つずつ含まれます。 最後のディレクトリエントリは空 (null 値で埋められます) で、ディレクトリテーブルの末尾を示します。

各インポートディレクトリエントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
ルックアップテーブルの RVA (特性) のインポート
インポート参照テーブルの RVA。 このテーブルには、各インポートの名前または序数が含まれています。 ("特性" という名前は、Winnt.h で使用されますが、このフィールドについては説明しません)。
4
4
時刻/日付スタンプ
イメージがバインドされるまで0に設定されるスタンプ。 イメージをバインドした後、このフィールドは DLL の時刻/データスタンプに設定されます。
8
4
フォワーダーチェーン
最初のフォワーダー参照のインデックス。
12
4
名前 RVA
DLL の名前を含む ASCII 文字列のアドレス。 このアドレスは、イメージベースを基準としています。
16
4
インポートアドレステーブル RVA (サンクテーブル)
インポートアドレステーブルの RVA。 このテーブルの内容は、イメージがバインドされるまで、インポートルックアップテーブルの内容と同じです。

ルックアップテーブルのインポート

インポートルックアップテーブルは、PE32 の32ビット数値の配列、または PE32 + の64ビット数値の配列です。 各エントリには、次の表で説明するビットフィールド形式が使用されます。 この形式では、ビット31は PE32 の最上位ビットであり、ビット63は PE32 + の最上位ビットです。 これらのエントリのコレクションは、指定された DLL からのすべてのインポートを記述します。 最後のエントリは、テーブルの末尾を示すゼロ (NULL) に設定されます。

ビット サイズ ビット フィールド 説明
31/63
1
序数/名前フラグ
このビットが設定されている場合は、序数でインポートします。 それ以外の場合は、名前でインポートします。 ビットは、PE32 の場合は0x80000000、PE32 + の場合は0x8000000000000000 としてマスクされます。
15-0
16
序数
16 ビットの序数。 このフィールドは、Ordinal/Name Flag ビット フィールドが 1 (序数でインポート) の場合にのみ使用されます。 ビット 30-15 または 62-15 は 0 である必要があります。
30-0
31
ヒント/名前テーブル RVA
ヒント/名前テーブル エントリの 31 ビット RVA。 このフィールドは、Ordinal/Name Flag ビット フィールドが 0 (名前でインポート) の場合にのみ使用されます。 PE32+ ビット 62 から 31 の場合は 0 である必要があります。

ヒント/名前テーブル

インポート セクション全体で 1 つのヒント/名前テーブルで十分です。 hint/name テーブルの各エントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
2
ヒント
エクスポート名ポインター テーブルへのインデックス。 この値で最初に一致が試行されます。 失敗した場合は、DLL のエクスポート名ポインター テーブルに対してバイナリ検索が実行されます。
2
変数
名前
インポートする名前を含む ASCII 文字列。 これは、DLL 内のパブリック名と一致する必要がある文字列です。 この文字列では大文字と小文字が区別され、null バイトで終了します。
*
0 または 1
Pad
必要に応じて、末尾の null バイトの後に出現する末尾のゼロパッド バイト。次のエントリを even 境界に配置します。

アドレス テーブルのインポート

インポート アドレス テーブルの構造と内容は、ファイルがバインドされるまで、インポート参照テーブルの構造と内容と同じです。 バインド中、インポート アドレス テーブルのエントリは、インポートされるシンボルの 32 ビット (PE32 の場合) または 64 ビット (PE32 以降の場合) のアドレスで上書きされます。 これらのアドレスはシンボルの実際のメモリ アドレスですが、技術的には "仮想アドレス" と呼ばれる場合があります。 通常、ローダーはバインディングを処理します。

.pdata セクション

.pdata セクションには、例外処理に使用される関数テーブル エントリの配列が含まれている。 これは、イメージ データ ディレクトリの例外テーブル エントリによって指されます。 エントリは、最終的なイメージに出力される前に、関数アドレス (各構造体の最初のフィールド) に従って並べ替える必要があります。 ターゲット プラットフォームは、以下で説明する 3 つの関数テーブルエントリ形式のバリエーションの中から、どのバリエーションを使用できるかを決定します。

32 ビット MIPS イメージの場合、関数テーブルのエントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
アドレスの開始
対応する関数の VA。
4
4
終了アドレス
関数の末尾の VA。
8
4
例外ハンドラー
実行する例外ハンドラーへのポインター。
12
4
ハンドラー データ
ハンドラーに渡される追加情報へのポインター。
16
4
Prolog の終了アドレス
関数のプロログの末尾の VA。

ARM、PowerPC SH3、SH4 Windows CEの場合、関数テーブルのエントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
アドレスの開始
対応する関数の VA。
4
8 ビット
Prolog の長さ
関数のプロログ内の命令の数。
4
22 ビット
関数の長さ
関数内の命令の数。
4
1 ビット
32 ビット フラグ
設定されている場合、関数は 32 ビット命令で構成されます。 クリアした場合、関数は 16 ビット命令で構成されます。
4
1 ビット
例外フラグ
設定すると、関数の例外ハンドラーが存在します。 それ以外の場合は、例外ハンドラーは存在しません。

x64 および Itanium プラットフォームの場合、関数テーブルのエントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
開始アドレス
対応する関数の RVA。
4
4
終了アドレス
関数の終了の RVA。
8
4
アンワインド情報
アンワインド情報の RVA。

Reloc セクション (イメージのみ)

ベース再配置テーブルには、イメージ内のすべての基本再配置のエントリが含まれます。 省略可能なヘッダーデータディレクトリのベース再配置テーブルフィールドには、ベース再配置テーブルのバイト数が示されます。 詳細については、「 オプションのヘッダーデータディレクトリ (イメージのみ)」を参照してください。 ベース再配置テーブルは、ブロックに分割されます。 各ブロックは、4K ページの基本再配置を表します。 各ブロックは、32ビットの境界で開始する必要があります。

ローダーは、PE ヘッダーで指定されているイメージベースで読み込みイメージを読み込むことができない場合を除き、リンカーによって解決されるベースの再配置を処理するためには必要ありません。

ベース再配置ブロック

各ベース再配置ブロックは、次の構造で始まります。

Offset サイズ フィールド 説明
0
4
ページ RVA
ベースの再配置を適用する必要がある VA を作成するために、イメージベースとページ RVA をそれぞれのオフセットに追加します。
4
4
ブロック サイズ
ベース再配置ブロックの合計バイト数。これには、ページの RVA とブロックサイズのフィールド、およびその後に続く型/オフセットフィールドが含まれます。

[ブロックサイズ] フィールドには、任意の数の型またはオフセットフィールドエントリが続きます。 各エントリは単語 (2 バイト) で、次のような構造になっています。

Offset サイズ フィールド 説明
0
4ビット
Type
単語の上位4ビットに格納されます。これは、適用される基本再配置の種類を示す値です。 詳細については、「 基本再配置型」を参照してください。
0
12ビット
Offset
残りの12ビットの単語に格納されます。これは、ブロックのページ RVA フィールドで指定された開始アドレスからのオフセットです。 このオフセットは、基本再配置を適用する場所を指定します。

基本再配置を適用するために、優先されるベースアドレスと、イメージが実際に読み込まれるベースとの差が計算されます。 イメージが優先するベースで読み込まれている場合、相違点はゼロであるため、ベースの再配置は適用する必要がありません。

基本再配置型

一定 説明
イメージの _ REL _ ベースの _ 絶対
0
基本再配置はスキップされます。 この型を使用して、ブロックを埋め込むことができます。
イメージの _ REL _ ベース _ -高
1
ベース再配置では、オフセットで16ビットフィールドに差の上位16ビットを追加します。 16ビットフィールドは、32ビットワードの high 値を表します。
イメージの _ REL _ ベース ( _ 低)
2
ベース再配置では、オフセットの16ビットフィールドに差の下位16ビットを追加します。 16ビットフィールドは、32ビットワードの下半分を表します。
イメージの _ REL _ ベースの _ HIGHLOW
3
ベース再配置では、オフセットで32ビットフィールドに32ビットの差分がすべて適用されます。
イメージの _ REL _ ベースの _ HIGHADJ
4
ベース再配置では、オフセットで16ビットフィールドに差の上位16ビットを追加します。 16ビットフィールドは、32ビットワードの high 値を表します。 32ビット値の下位16ビットは、この基本再配置の後にある16ビットワードに格納されます。 これは、このベース再配置が2つのスロットを占有することを意味します。
イメージの _ REL _ ベースの _ MIPS _ JMPADDR
5
再配置の解釈は、コンピューターの種類によって異なります。
コンピューターの種類が MIPS の場合、ベース再配置は MIPS ジャンプ命令に適用されます。
イメージの _ REL _ ベースの _ ARM _ MOV32
5
この再配置は、マシンの種類が ARM または Thumb の場合にのみ意味を持ちます。 ベース再配置では、連続した MOVW/MOVW 命令ペア全体で、シンボルの32ビットアドレスを適用します。
イメージの _ REL _ ベースの _ riscv _ HIGH20
5
この再配置は、コンピューターの種類が RISC-V の場合にのみ意味があります。 基本再配置は、32ビットの絶対アドレスの上位20ビットに適用されます。
6
予約済み。0にする必要があります。
イメージの _ REL _ ベースの _ THUMB _ MOV32
7
この再配置は、コンピューターの種類が Thumb の場合にのみ意味を持ちます。 ベース再配置は、シンボルの32ビットアドレスを、連続する MOVW/MOVW 命令ペアに適用します。
イメージの _ REL _ ベースの _ riscv _ LOW12I
7
この再配置は、コンピューターの種類が RISC-V の場合にのみ意味があります。 基本再配置は、RISC-V I type 命令形式で形成された32ビットの絶対アドレスの下位12ビットに適用されます。
IMAGE _ REL _ ベース _ の RISCV _ LOW12S
8
この再配置は、マシンの種類が RISC-V の場合にのみ意味があります。 ベース再配置は、RISC-V S 型命令形式で形成された 32 ビットの絶対アドレスの低い 12 ビットに適用されます。
IMAGE _ REL _ BASED _ MIPS _ JMPADDR16
9
再配置は、マシンの種類が MIPS の場合にのみ意味があります。 ベース再配置は、MIPS16 ジャンプ命令に適用されます。
IMAGE _ REL _ BASED _ DIR64
10
基本再配置では、オフセットの 64 ビット フィールドに差が適用されます。

.tls セクション

.tls セクションでは、静的スレッド ローカル ストレージ (TLS) に対する PE と COFF の直接サポートが提供されます。 TLS は、データ オブジェクトが自動 (スタック) 変数ではなく、コードを実行する個々のスレッドに対してローカルである Windows がサポートする特殊なストレージ クラスです。 したがって、各スレッドは、TLS を使用して宣言された変数に対して異なる値を維持できます。

API 呼び出し TlsAlloc、TlsFree、TlsSetValue、および TlsGetValue を使用して、任意の量の TLS データをサポートできます。 PE または COFF の実装は、API を使用するための代替アプローチであり、高レベルの言語プログラマの視点から見た方が簡単という利点があります。 この実装により、TLS データを定義し、プログラムの通常の静的変数と同様に初期化できます。 たとえば、Visual C++ API を使用せずに、静的 TLS 変数を次のようにWindowsできます。

__declspec (thread) int tlsFlag = 1;

このプログラミングコンストラクトをサポートするために、PE および COFF .tls セクションでは、初期化データ、スレッドごとの初期化と終了のためのコールバック ルーチン、TLS インデックスを指定します。この情報については、次の説明で説明します。

注意

静的に宣言された TLS データ オブジェクトは、静的に読み込まれたイメージ ファイルでのみ使用できます。 この事実により、DLL またはそれに静的にリンクされている何かが LoadLibrary API 関数を使用して動的に読み込まれなかったことを知らない限り、DLL で静的 TLS データを使用することはできません。

実行可能コードは、次の手順で静的 TLS データ オブジェクトにアクセスします。

  1. リンク時に、リンカーは TLS ディレクトリの [インデックスのアドレス] フィールドを設定します。 このフィールドは、プログラムが TLS インデックスを受け取る場所を示します。

    Microsoft の実行時ライブラリは、TLS ディレクトリのメモリ イメージを定義し _ _ 、"tls _ used" (Intel x86 プラットフォーム) または _ "tls _ used" (その他のプラットフォーム) という特別な名前を付け、このプロセスを容易にしています。 リンカーは、このメモリ イメージを検索し、そこでデータを使用して TLS ディレクトリを作成します。 TLS をサポートし、Microsoft リンカーを使用する他のコンパイラでも、この同じ手法を使用する必要があります。

  2. スレッドが作成されると、ローダーはスレッド環境ブロック (TEB) のアドレスを FS レジスタに配置することで、スレッドの TLS 配列のアドレスを通信します。 TLS 配列へのポインターは、TEB の先頭から0x2Cのオフセットです。 この動作は Intel x86 固有です。

  3. ローダーは、 [インデックスのアドレス] フィールドで示された場所に TLS インデックスの値を割り当てる。

  4. 実行可能コードは、TLS インデックスと TLS 配列の場所を取得します。

  5. このコードでは、TLS インデックスと TLS 配列の場所 (インデックスに 4 を乗算し、それを配列のオフセットとして使用) を使用して、指定されたプログラムとモジュールの TLS データ領域のアドレスを取得します。 各スレッドには独自の TLS データ領域がありますが、これはプログラムに対して透過的であり、個々のスレッドにデータが割り当てられる方法を知る必要はありません。

  6. 個々の TLS データ オブジェクトには、TLS データ領域への固定オフセットとしてアクセスされます。

TLS 配列は、システムが各スレッドに対して保持するアドレスの配列です。 この配列内の各アドレスは、プログラム内の特定のモジュール (EXE または DLL) の TLS データの場所を示します。 TLS インデックスは、使用する配列のメンバーを示します。 インデックスは、モジュールを識別する数値 (システムにとってのみ意味があります) です。

TLS ディレクトリ

TLS ディレクトリの形式は次のとおりです。

Offset (PE32/ PE32+) サイズ (PE32/PE32+) フィールド 説明
0
4/8
生データの開始 VA
TLS テンプレートの開始アドレス。 このテンプレートは、TLS データの初期化に使用されるデータブロックです。 このデータはすべて、スレッドが作成されるたびコピーされます。そのため、このデータは破損していけずに行う必要があります。 このアドレスは RVA ではありません。これは、.reloc セクションにベース再配置が必要なアドレスです。
4/8
4/8
Raw Data End VA
ゼロフィルを除く、TLS の最後のバイトのアドレス。 Raw Data Start VA フィールドと同様に、これは RVA ではなく VA です。
8/16
4/8
インデックスのアドレス
ローダーが割り当てる TLS インデックスを受信する場所。 この場所は通常のデータ セクション内にあるので、プログラムからアクセスできるシンボリック名を指定できます。
12/24
4/8
コールバックのアドレス
TLS コールバック関数の配列へのポインター。 配列は null で終了します。したがって、コールバック関数がサポートされている場合、このフィールドは 0 に設定された 4 バイトをポイントします。 これらの関数のプロトタイプについては、「TLS コールバック関数」 を参照してください
16/32
4
ゼロフィルのサイズ
Raw Data Start VA フィールドと Raw Data End VA フィールドで区切られた初期化されたデータを超える、テンプレートのバイト単位のサイズ。 テンプレートの合計サイズは、イメージ ファイル内の TLS データの合計サイズと同じである必要があります。 ゼロフィルは、初期化された 0 以外のデータの後のデータの量です。
20/36
4
特性
4 ビット [ 23:20 は、ア ] ラインメント情報を記述します。 指定できる値は、IMAGE SCN ALIGN として定義されている値です。これは、オブジェクト ファイル内のセクションの配置 _ _ _ * を記述するためにも使用されます。 他の 28 ビットは、将来使用するために予約されています。

TLS コールバック関数

プログラムは、TLS データ オブジェクトの追加の初期化と終了をサポートする 1 つ以上の TLS コールバック関数を提供できます。 このようなコールバック関数の一般的な使用は、オブジェクトのコンストラクターとデストラクターを呼び出す場合です。

通常、コールバック関数は 1 つ以下ですが、必要に応じてコールバック関数を追加するために、コールバックが配列として実装されます。 複数のコールバック関数がある場合、各関数は、そのアドレスが配列に出現する順序で呼び出されます。 null ポインターが配列を終了します。 空のリスト (コールバックはサポートされていません) を持つのは完全に有効です。その場合、コールバック配列には 1 つのメンバーと null ポインターが 1 つ必要です。

コールバック関数 (PIMAGE TLS CALLBACK 型のポインターによって指される) のプロトタイプには、DLL エントリ ポイント関数と同じ _ _ パラメーターがあります。

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

Reserved パラメーターは 0 に設定する必要があります。 Reason パラメーターには、次の値を指定できます。

設定 説明
DLL _ プロセスアタッチ _
1
最初のスレッドを含む新しいプロセスが開始されました。
DLL _ スレッド _ アタッチ
2
新しいスレッドが作成されました。 この通知は、最初のスレッドを含むすべてのスレッドに対して送信されます。
DLL _ スレッドの _ デタッチ
3
スレッドの終了が近い。 この通知は、最初のスレッドを含むすべてのスレッドに対して送信されます。
DLL _ プロセスの _ デタッチ
0
元のスレッドを含め、プロセスが終了する可能性があります。

読み込み構成構造 (イメージのみ)

読み込み構成構造 (IMAGE LOAD CONFIG DIRECTORY) は、以前は _ _ _ 、Windows NT オペレーティング システム自体の非常に限られたケースで、イメージのファイル ヘッダーまたは省略可能なヘッダーで記述するには、さまざまな機能が難しすぎるか、大きすぎて記述できません。 現在のバージョンの Microsoft リンカーと Windows XP 以降のバージョンの Windows では、予約済みの SEH テクノロジを含む 32 ビット x86 ベースのシステムに対して、この構造の新しいバージョンが使用されます。 これにより、オペレーティング システムが例外ディスパッチ時に使用する安全な構造化例外ハンドラーの一覧が提供されます。 ハンドラー アドレスがイメージの VA 範囲内に存在し、予約済みの SEH 対応としてマークされている場合 (つまり、前述のように、省略可能なヘッダーの _ _ DllCharacteristics フィールドで IMAGE DLLCHARACTERISTICS NO _ SEH が明確である) 場合、ハンドラーはそのイメージの既知のセーフ ハンドラーの一覧に存在する必要があります。 それ以外の場合、オペレーティング システムはアプリケーションを終了します。 これは、オペレーティング システムを制御するために過去に使用された "x86 例外ハンドラーハイジャック" の悪用を防ぐのに役立ちます。

Microsoft リンカーは、予約済みの SEH データを含む既定の読み込み構成構造を自動的に提供します。 ユーザー コードが既に読み込み構成構造を提供している場合は、新しい予約済み SEH フィールドを含める必要があります。 それ以外の場合、リンカーに予約済みの SEH データを含め、イメージが予約済み SEH を含むとしてマークされていない。

構成ディレクトリの読み込み

事前に予約された SEH 読み込み構成構造のデータ ディレクトリ エントリは、オペレーティング システム ローダーが常に特定の値と見なすので、読み込み構成構造の特定のサイズを指定する必要があります。 その点で、サイズは実際にはバージョン チェックに限定されます。 Windows XP およびそれ以前のバージョンの Windows との互換性を保つには、x86 イメージの場合、サイズは 64 である必要があります。

構成レイアウトの読み込み

読み込み構成構造には、32 ビットおよび 64 ビット PE ファイル用の次のレイアウトがあります。

Offset サイズ フィールド 説明
0
4
特性
現在使用されていないファイルの属性を示すフラグ。
4
4
TimeDateStamp
日付と時刻のスタンプ値。 この値は、システム クロックに従って、午前 0 時 (00:00:00)、1970 年 1 月 1 日、世界調整時刻から経過した秒数で表されます。 タイム スタンプは、C ランタイム (CRT) 時刻関数を使用して印刷できます。
8
2
MajorVersion
メジャー バージョン番号。
10
2
MinorVersion
マイナー バージョン番号。
12
4
GlobalFlagsClear
グローバル ローダーは、ローダーがプロセスを開始すると、このプロセスをクリアするフラグを設定します。
16
4
GlobalFlagsSet
ローダーがプロセスを開始すると、このプロセスに設定するグローバル ローダー フラグ。
20
4
CriticalSectionDefaultTimeout
破棄されるこのプロセスのクリティカル セクションに使用する既定のタイムアウト値。
24
4/8
DeCommitFreeBlockThreshold
システムに返される前に解放する必要があるメモリ (バイト単位)。
28/32
4/8
DeCommitTotalFreeThreshold
空きメモリの合計量 (バイト単位)。
32/40
4/8
LockPrefixTable
[x86 のみ LOCK プレフィックスが使用されるアドレスの一覧の VA。単一のプロセッサ マシン上で NOP に置 ] き換え可能です。
36/48
4/8
MaximumAllocationSize
最大割り当てサイズ (バイト単位)。
40/56
4/8
VirtualMemoryThreshold
仮想メモリの最大サイズ (バイト単位)。
44/64
4/8
ProcessAffinityMask
このフィールドを 0 以外の値に設定する方法は、プロセスの起動時にこの値を使用して SetProcessAffinityMask を呼び出すのと同じです (.exeのみ)
48/72
4
ProcessHeapFlags
HeapCreate 関数の最初の引数に対応するプロセス ヒープ フラグ。 これらのフラグは、プロセスの起動時に作成されるプロセス ヒープに適用されます。
52/76
2
CSDVersion
サービス パックのバージョン識別子。
54/78
2
予約されています。
ゼロを指定してください。
56/80
4/8
EditList
システムで使用するために予約されています。
60/88
4/8
SecurityCookie
または GS の実装で使用されるクッキー Visual C++ポインター。
64/96
4/8
SEHandlerTable
[x86 のみ イメージ内の有効な一意のオブジェクト ハンドラーの、並べ替Standard Edition ] テーブルの VA。
68/104
4/8
SEHandlerCount
[x86 のみ ] テーブル内の一意のハンドラーの数。
72/112
4/8
GuardCFCheckFunctionPointer
Control Flow Guard check-function ポインターが格納されている VA。
76/120
4/8
GuardCFDispatchFunctionPointer
Control Flow Guard ディスパッチ関数ポインターが格納されている VA。
80/128
4/8
GuardCFFunctionTable
イメージ内の各 Control Flow Guard 関数の並べ替えテーブルの VA。
84/136
4/8
GuardCFFunctionCount
上の表の一意の RVA の数。
88/144
4
GuardFlags
Guard Flowフラグを制御します。
92/148
12
CodeIntegrity
コードの整合性情報。
104/160
4/8
GuardAddressTakenIatEntryTable
Control Flow Guard アドレスが IAT テーブルを受け取った VA が格納されます。
108/168
4/8
GuardAddressTakenIatEntryCount
上の表の一意の RVA の数。
112/176
4/8
GuardLongJumpTargetTable
Control Flow Guard の長いジャンプ 先テーブルが格納されている VA。
116/184
4/8
GuardLongJumpTargetCount
上の表の一意の RVA の数。

GuardFlags フィールドには、次のフラグとサブフィールドの 1 つ以上の組み合わせが含まれます。

  • モジュールは、システム提供のサポートを使用して制御フローの整合性チェックを実行します。

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • モジュールは、制御フローと書き込み整合性チェックを実行します。

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • モジュールには、有効な制御フロー ターゲット メタデータが含まれています。

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • モジュールでは/GS セキュリティ Cookie は使用されない。

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • モジュールでは、読み取り専用遅延読み込み IAT がサポートされます。

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • 自由に再保護できる独自の .didat セクション (他に何も含め) にインポート テーブルを遅延読み込みします。

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • モジュールには、抑制されたエクスポート情報が含まれている。 また、これは、IAT テーブルを受け取ったアドレスが読み込み構成にも存在すると見なします。

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • モジュールを使用すると、エクスポートを抑制できます。

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • モジュールには longjmp ターゲット情報が含まれている。

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Control Flow Guard 関数テーブル エントリのストライド (つまり、テーブル エントリあたりの追加のバイト数) を含むサブフィールドのマスク。

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

さらに、Windows SDK winnt.h ヘッダーでは、GuardFlags 値を右シフトして Control Flow Guard 関数テーブルストライドを右にシフトするビット数に対して、このマクロを定義します。

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

.rsrc セクション

リソースは、複数レベルのバイナリ並べ替えツリー構造によってインデックスが作成されます。 一般的な設計では、2 * * つの 31 レベルを組み込む可能性があります。 ただし、規則により、次の 3 Windowsが使用されます。

Type 名前 Language

一連のリソース ディレクトリ テーブルは、次の方法ですべてのレベルを関連付ける: 各ディレクトリ テーブルの後に、そのレベルの名前または識別子 (ID) (種類、名前、または言語レベル) と、データ記述または別のディレクトリ テーブルのアドレスを指定する一連のディレクトリ エントリが続きます。 アドレスがデータの説明をポイントしている場合、データはツリー内のリーフになります。 アドレスが別のディレクトリ テーブルを参照している場合、そのテーブルには次のレベルでディレクトリ エントリが一覧表示されます。

リーフの種類、名前、言語の各 ID は、ディレクトリ テーブルを介してリーフに到達するために使用されるパスによって決まります。 最初のテーブルは型 ID を決定し、2 番目のテーブル (最初のテーブルのディレクトリ エントリによって指される) は名前 ID を決定し、3 番目のテーブルは言語 ID を決定します。

.rsrc セクションの一般的な構造は次です。

Data 説明
リソース ディレクトリ テーブル (およびリソース ディレクトリ エントリ)
ツリー内のノードのグループごとに 1 つの一連のテーブル。 すべてのトップ レベル (種類) ノードが最初のテーブルに一覧表示されます。 このテーブルのエントリは、第 2 レベルのテーブルを指します。 2 番目のレベルの各ツリーには、同じ型 ID がありますが、名前 ID は異なります。 3 番目のレベルのツリーの種類と名前の ID は同じですが、言語の ID は異なります。
各テーブルの直後にディレクトリ エントリが続きます。各エントリには、名前または数値識別子と、次の下位レベルのデータ記述またはテーブルへのポインターが含まれます。
リソース ディレクトリ文字列
ディレクトリ エントリによって指される文字列データとして機能する、2 バイトでアラインされた Unicode 文字列。
リソース データの説明
リソース データの実際のサイズと場所を記述する、テーブルによって指されるレコードの配列。 これらのレコードは、リソース記述ツリーのリーフです。
リソース データ
リソース セクションの生データ。 [リソース データの説明] フィールドのサイズと場所の情報は、リソース データの個々のリージョンを区切っています。

リソース ディレクトリ テーブル

各リソース ディレクトリ テーブルの形式は次のとおりです。 テーブルは実際にはディレクトリ エントリ (セクション 6.9.2「リソース ディレクトリ エントリ」で説明) とこの構造で構成されているので、このデータ構造はテーブルの見出しと見なす必要があります。

Offset サイズ フィールド 説明
0
4
特性
リソース フラグ。 このフィールドは将来使用するために予約されています。 現在は 0 に設定されています。
4
4
Time/Date スタンプ
リソース データがリソース コンパイラによって作成された時刻。
8
2
メジャー バージョン
ユーザーが設定したメジャー バージョン番号。
10
2
マイナー バージョン
ユーザーが設定したマイナー バージョン番号。
12
2
名前エントリの数
(テーブルのレベルに応じて) 文字列を使用して Type、Name、または Language エントリを識別する、テーブルの直後のディレクトリ エントリの数。
14
2
ID エントリの数
型、名前、または言語のエントリに数値の ID を使用する Name エントリの直後のディレクトリ エントリの数。

リソース ディレクトリ エントリ

ディレクトリ エントリは、テーブルの行を構成します。 各リソース ディレクトリ エントリの形式は次のとおりです。 エントリが Name エントリか ID エントリかは、リソース ディレクトリ テーブルによって示されます。これは、それに続く名前エントリと ID エントリの数を示します (すべての Name エントリがテーブルのすべての ID エントリの前に付く点に注意してください)。 テーブルのすべてのエントリは昇順に並べ替えされます。大文字と小文字を区別する文字列による名前エントリと、数値による ID エントリです。 オフセットは、IMAGE _ DIRECTORY ENTRY RESOURCE _ DataDirectory 内の _ アドレスに対する相対値です。 詳細 については、「Peering Inside the PE: A Tour of the Win32 Portable Executable File Format」 を参照してください。

Offset サイズ フィールド 説明
0
4
名前オフセット
テーブルのレベルに応じて、Type、Name、または Language ID エントリを指定する文字列のオフセット。
0
4
整数 ID
Type、Name、または Language ID エントリを識別する 32 ビット整数。
4
4
データ入力オフセット
高ビット 0。 リソース データ エントリ (リーフ) のアドレス。
4
4
サブディレクトリ オフセット
高ビット 1。 下位 31 ビットは、別のリソース ディレクトリ テーブル (次のレベルダウン) のアドレスです。

リソース ディレクトリ文字列

リソース ディレクトリ文字列領域は、単語でアラインされた Unicode 文字列で構成されます。 これらの文字列は、最後の Resource Directory エントリの後、最初のリソース データ エントリの前にまとめて格納されます。 これにより、固定サイズのディレクトリ エントリの配置に対するこれらの可変長文字列の影響を最小限に抑えます。 各リソース ディレクトリ文字列の形式は次のとおりです。

Offset サイズ フィールド 説明
0
2
長さ
長さフィールド自体を含めない文字列のサイズ。
2
変数
Unicode 文字列
ワードアラインされた可変長 Unicode 文字列データ。

リソース データ エントリ

各リソース データ エントリは、リソース データ領域内の生データの実際の単位を記述します。 リソース データ エントリの形式は次のとおりです。

Offset サイズ フィールド 説明
0
4
データ RVA
リソース データ領域内のリソース データの単位のアドレス。
4
4
サイズ
Data RVA フィールドによって指されるリソース データのサイズ (バイト単位)。
8
4
codepage
リソース データ内のコード ポイント値をデコードするために使用されるコード ページ。 通常、コード ページは Unicode コード ページになります。
12
4
予約済み。 は 0 である必要があります。

.cormeta セクション (オブジェクトのみ)

CLR メタデータは、このセクションに格納されます。 オブジェクト ファイルにマネージド コードが含まれているかどうかを示すために使用されます。 メタデータの形式は文書化されませんが、メタデータを処理するために CLR インターフェイスに渡す場合があります。

Sxdata セクション

オブジェクトの有効な例外ハンドラーは、そのオブジェクトの sxdata セクションに一覧表示されます。 セクションは、IMAGE SCN LNK INFO とマークされてい _ _ _ ます。 これには、各有効なハンドラーの COFF シンボルインデックスが含まれており、インデックスごとに4バイトを使用します。

また、コンパイラは、 @feat.00 値フィールドの LSB が1に設定された絶対シンボル "" を出力することで、COFF オブジェクトを登録済みの SEH としてマークします。 SEH ハンドラーが登録されていない COFF オブジェクトでは、"" 記号が使用され @feat.00 ますが、 sxdata セクションは存在しません。

アーカイブ (ライブラリ) ファイル形式

COFF アーカイブ形式には、オブジェクトファイルのコレクションを格納するための標準的なメカニズムが用意されています。 これらのコレクションは、プログラミングドキュメントでは一般にライブラリと呼ばれています。

アーカイブの最初の8バイトは、ファイルの署名で構成されます。 アーカイブの残りの部分は、次のように一連のアーカイブメンバーで構成されます。

  • 1番目と2番目のメンバーは "リンカーメンバー" です。 これらの各メンバーには、「 インポート名の種類」で説明されている独自の形式があります。 通常、リンカーはこれらのアーカイブメンバーに情報を格納します。 リンカーのメンバーには、アーカイブのディレクトリが含まれます。

  • 3番目のメンバーは "longnames" メンバーです。 この省略可能なメンバーは、一連の null で終わる ASCII 文字列で構成され、各文字列は別の archive メンバーの名前です。

  • アーカイブの残りの部分は、標準 (オブジェクトファイル) のメンバーで構成されます。 これらの各メンバーには、1つのオブジェクトファイル全体のコンテンツが含まれています。

Archive メンバーヘッダーは、各メンバーの前にあります。 次の一覧は、アーカイブの一般的な構造を示しています。

  • 署名: "! <arch > \ n "

  • ヘッダー

    1番目のリンカーメンバー
  • ヘッダー

    2番目のリンカーメンバー
  • ヘッダー

    Longnames メンバー
  • ヘッダー

    OBJ ファイル1の内容 (COFF 形式)
  • ヘッダー

    OBJ ファイル2の内容 (COFF 形式)

アーカイブファイルの署名

アーカイブファイルの署名は、ファイルの種類を識別します。 アーカイブファイルを入力として受け取るすべてのユーティリティ (たとえば、リンカー) は、この署名を読み取ることでファイルの種類を確認できます。 署名は次の ASCII 文字で構成されています。これらの文字は、改行文字 (n) を除いて、次の各文字が文字どおりに表現され \ ます。

!<arch>\n

メンバーヘッダーのアーカイブ

各メンバー (リンカー、longnames、またはオブジェクトファイルのメンバー) の前には、ヘッダーが付きます。 Archive メンバーヘッダーの形式は次のとおりです。各フィールドは、左揃えで、フィールドの末尾にスペースが埋め込まれた ASCII テキスト文字列です。 これらのフィールドのいずれかに終端の null 文字がありません。

各メンバーヘッダーは、前の archive メンバーの末尾の後の最初のアドレスで開始されます。

Offset サイズ フィールド 説明
0
16
名前
名前を終了するためにスラッシュ (/) を追加した archive メンバーの名前。 最初の文字がスラッシュの場合、次の表で説明するように、名前には特別な解釈があります。
16
12
Date
アーカイブメンバーが作成された日付と時刻。これは、1/1/1970 年以降の秒数を表す ASCII 10 進数表現です。
28
6
User ID
ユーザー ID の ASCII 10 進数表現。 Microsoft ツールはすべての空白を出力するため、このフィールドには Windows プラットフォームに意味のある値が含まれていません。
34
6
グループ ID
グループ ID の ASCII 10 進数表現。 Microsoft ツールはすべての空白を出力するため、このフィールドには Windows プラットフォームに意味のある値が含まれていません。
40
8
モード
メンバーのファイルモードの ASCII 8 進数表現。 これは、 _ C ランタイム関数 wstat の ST モード値です _ 。
48
10
サイズ
アーカイブメンバーの合計サイズの ASCII 10 進数表現。ヘッダーのサイズは含まれません。
58
2
ヘッダーの末尾
C 文字列 "名内 n" の2バイト \ (0x60 0x0a)。

名前フィールドには、次の表に示す形式のいずれかが含まれています。 前述のように、これらの各文字列は左揃えになり、16バイトのフィールド内に末尾のスペースが埋め込まれています。

名前フィールドの内容 説明
指定
アーカイブメンバーの名前。
/
Archive メンバーは、2つのリンカーメンバーのうちの1つです。 両方のリンカーメンバーにこの名前が付いています。
//
Archive メンバーは、一連の null で終わる ASCII 文字列で構成される longnames メンバーです。 Longnames メンバーは、3番目の archive メンバーであり、省略可能です。
/n
Archive メンバーの名前は、longnames メンバー内のオフセット n にあります。 数値 n はオフセットの10進数表現です。 たとえば、"/26" は、アーカイブメンバーの名前が longnames メンバーコンテンツの先頭を超えて26バイトであることを示します。

最初のリンカーメンバー

最初のリンカーメンバーの名前は、"/" です。 最初のリンカーメンバーは、旧バージョンとの互換性のために用意されています。 現在のリンカーでは使用されませんが、形式は正しい必要があります。 このリンカーメンバーは、2番目のリンカーメンバーと同様に、シンボル名のディレクトリを提供します。 シンボルごとに、この情報は、シンボルが含まれている archive メンバーを検索する場所を示します。

最初のリンカーメンバーの形式は次のとおりです。 この情報は、ヘッダーの後に表示されます。

Offset サイズ フィールド 説明
0
4
シンボルの数
インデックス付きシンボルの数を含む Unsigned long。 この数値は、ビッグエンディアン形式で格納されます。 通常、各オブジェクトファイルのメンバーは1つ以上の外部シンボルを定義します。
4
4 * n
オフセット
メンバーヘッダーをアーカイブするためのファイルオフセットの配列。 n は、記号フィールドの数と等しくなります。 配列内の各数値は、ビッグエンディアン形式で格納された符号なし long です。 文字列テーブル内のという名前のシンボルごとに、オフセット配列内の対応する要素によって、シンボルを含む archive メンバーの場所が指定されます。
*
*
文字列テーブル
ディレクトリ内のすべてのシンボルに名前を指定する、一連の null で終わる文字列。 各文字列は、前の文字列の null 文字の直後に開始されます。 文字列の数は、[記号の数] フィールドの値と同じである必要があります。

オフセット配列内の要素は昇順に配置する必要があります。 この事実は、文字列テーブル内のシンボルをアーカイブメンバーの順序に従って配置する必要があることを意味します。 たとえば、最初のオブジェクトファイルのメンバー内のすべてのシンボルは、2番目のオブジェクトファイルのシンボルの前にリストされている必要があります。

2番目のリンカーメンバー

2番目のリンカーメンバーの名前は、最初のリンカーメンバーと同じです。 両方のリンカーメンバーがシンボルのディレクトリを提供し、それらを含むアーカイブメンバーであっても、2番目のリンカーメンバーは、現在のすべてのリンカーの最初のメンバーに優先して使用されます。 2番目のリンカーメンバーには、シンボル名が構文順に含まれています。これにより、名前による検索が高速になります。

2番目のメンバーの形式は次のとおりです。 この情報は、ヘッダーの後に表示されます。

Offset サイズ フィールド 説明
0
4
メンバー数
アーカイブメンバーの数を含む unsigned long です。
4
4 * m
オフセット
メンバーヘッダーをアーカイブするためのファイルオフセットの配列。昇順で配置されます。 各オフセットは unsigned long です。 M の数値は、メンバーの数フィールドの値と同じです。
*
4
シンボルの数
インデックスが作成されたシンボルの数を表す unsigned long です。 通常、各オブジェクトファイルのメンバーは1つ以上の外部シンボルを定義します。
*
2 * n
連想
シンボル名をアーカイブメンバーのオフセットにマップする、1から始まるインデックス (unsigned short) の配列。 数値 n は、[記号の数] フィールドに相当します。 文字列テーブル内のという名前のシンボルごとに、インデックス配列内の対応する要素によって、オフセット配列へのインデックスが提供されます。 さらに、オフセット配列は、シンボルを含む archive メンバーの場所を示します。
*
*
文字列テーブル
ディレクトリ内のすべてのシンボルに名前を指定する、一連の null で終わる文字列。 各文字列は、前の文字列の null バイトの直後に開始されます。 文字列の数は、[記号の数] フィールドの値と同じである必要があります。 次の表は、すべてのシンボル名を構文の昇順で示しています。

Longnames メンバー

Longnames メンバーの名前は "//" です。 Longnames メンバーは、アーカイブメンバー名の一連の文字列です。 名前フィールド (16 バイト) に十分な空き領域がない場合にのみ、ここに名前が表示されます。 Longnames メンバーは省略可能です。 ヘッダーだけで空にすることも、ヘッダーを使用せずに完全に省略することもできます。

文字列は null で終わります。 各文字列は、前の文字列の null バイトの直後に開始されます。

インポートライブラリの形式

従来のインポートライブラリ (つまり、あるイメージから別のイメージで使用するためにエクスポートを記述するライブラリ) は、通常、「セクション7、 アーカイブ (ライブラリ) ファイル形式」で説明されているレイアウトに従います。 主な違いは、インポートライブラリのメンバーには、実際のオブジェクトではなく疑似オブジェクトファイルが含まれており、各メンバーにはセクション6.4 で説明されているインポートテーブルを作成するために必要なセクションが含まれます 。 idata セクション では、エクスポートアプリケーションのビルド中に、リンカーがこのアーカイブを生成します。

インポートに関するセクションの投稿は、少数の情報から推論できます。 リンカーは、ライブラリの作成時に各メンバーのインポートライブラリに完全な詳細情報を生成するか、標準の情報のみをライブラリに書き込んで、後で使用するアプリケーションが必要なデータをすぐに生成できるようにします。

長い形式のインポートライブラリでは、1つのメンバーに次の情報が含まれています。

メンバーヘッダーのアーカイブ ファイル ヘッダー セクションヘッダー 各セクションヘッダーに対応するデータ COFF シンボルテーブル 文字列

これに対して、短いインポートライブラリは次のように記述されます。

メンバーヘッダーのアーカイブ ヘッダーのインポート Null で終わるインポート名の文字列 Null で終わる DLL 名の文字列

これは、使用時にメンバーのコンテンツ全体を正確に再構築するのに十分な情報です。

ヘッダーのインポート

Import ヘッダーには、次のフィールドとオフセットが含まれています。

Offset サイズ フィールド 説明
0
2
Sig1
IMAGE _ FILE _ MACHINE UNKNOWN である _ 必要があります。 詳細については、「マシンの種類」 を参照してください
2
2
Sig2
を指定する必要0xFFFF。
4
2
Version
構造体のバージョン。
6
2
Machine
ターゲット マシンの種類を識別する数値。 詳細については、「マシンの種類」 を参照してください
8
4
Time-Date スタンプ
ファイルが作成された日時。
12
4
データのサイズ
ヘッダーの後ろの文字列のサイズ。
16
2
序数/ヒント
[名前の種類] フィールドの値によって決定される、インポートの序数またはヒント。
18
2 ビット
Type
インポートの種類。 特定の値と説明については、「インポートの種類」 を参照してください
3 ビット
名前の種類
インポート名の種類。 詳細については、「インポート名の種類 」を参照してください
11 ビット
予約されています。
予約済み。 は 0 である必要があります。

この構造体の後に、インポートされたシンボルの名前と、それが作成された DLL を記述する null で終わる 2 つの文字列が続きます。

インポートの種類

インポート ヘッダーの Type フィールドには、次の値が定義されています。

一定 説明
コードの _ インポート
0
実行可能コード。
データの _ インポート
1
データ。
IMPORT _ CONST
2
.def ファイルで CONST として指定されます。

これらの値は、ライブラリを使用するツールがデータにアクセスする必要がある場合に生成する必要があるセクションの投稿を決定するために使用されます。

インポート名の種類

null で終えられるインポート シンボル名は、関連付けられているインポート ヘッダーの直後に続きます。 インポート ヘッダーの [名前の種類] フィールドには、次の値が定義されています。 インポートを表す正しいシンボルを生成するために名前を使用する方法を示します。

一定 説明
序 _ 数のインポート 0 インポートは序数によって行います。 これは、インポート ヘッダーの [序数/ヒント] フィールドの値がインポートの序数を表します。 この定数を指定しない場合、Ordinal/Hint フィールドは常にインポートのヒントとして解釈される必要があります。
インポート _ 名 1 インポート名は、パブリック シンボル名と同じです。
インポート _ 名 _ NOPREFIX 2 インポート名はパブリック シンボル名ですが、先頭の ?、@、または省略可能な をスキップします _ 。
IMPORT _ NAME _ UNDECORATE 3 インポート名はパブリック シンボル名ですが、先頭の ?、@、または必要に応じて をスキップし、最初の で _ 切り捨てを行います @ 。

付録 A: Authenticode PE イメージ ハッシュの計算

複数の属性証明書を使用して、イメージの整合性を確認する必要があります。 ただし、最も一般的な方法は Authenticode 署名です。 Authenticode 署名を使用して、PE イメージ ファイルの関連セクションがファイルの元の形式から何も変更されていないか確認できます。 このタスクを実行するために、Authenticode 署名には PE イメージ ハッシュと呼ばれるものが含まれている

Authenticode PE イメージ ハッシュとは

Authenticode PE イメージ ハッシュ (短い場合はファイル ハッシュ) は、ファイルの整合性に関連する小さな値が生成されるという点で、ファイル チェックサムに似ています。 チェックサムは単純なアルゴリズムによって生成され、主にメモリ障害を検出するために使用されます。 つまり、ディスク上のメモリ ブロックが破損し、そこに格納されている値が破損したかどうかを検出するために使用されます。 ファイル ハッシュは、ファイルの破損も検出する点でチェックサムに似ています。 ただし、ほとんどのチェックサム アルゴリズムとは異なり、元の (変更されていない) 形式と同じファイル ハッシュを持つファイルを変更することは非常に困難です。 つまり、チェックサムは破損につながる単純なメモリ障害を検出することを目的としていますが、ファイル ハッシュを使用して、ウイルス、ハッカー、またはトロイの木馬プログラムによって導入されたファイルに対する意図的で微妙な変更を検出できます。

Authenticode 署名では、ファイルハッシュは、ファイルの署名者にのみ知られているプライベート キーを使用してデジタル署名されます。 ソフトウェア コンシューマーは、ファイルのハッシュ値を計算し、Authenticode デジタル署名に含まれる署名付きハッシュの値と比較することで、ファイルの整合性を確認できます。 ファイル ハッシュが一致しない場合は、PE イメージ ハッシュの対象となるファイルの一部が変更されています。

Authenticode PE イメージ ハッシュでカバーされる情報

PE イメージ ハッシュの計算に、すべてのイメージ ファイル データを含めることができるようになりました。また、望ましくありません。 望ましくない特性が単に表示される場合があります (たとえば、一般にリリースされたファイルからデバッグ情報を削除することはできません)。単純に不可能な場合があります。 たとえば、イメージ ファイル内のすべての情報を Authenticode 署名に含め、PE イメージ ハッシュを含む Authenticode 署名を PE イメージに挿入し、後で計算にすべてのイメージ ファイル データを含めて同一の PE イメージ ハッシュを生成できるとは限りはありません。これは、ファイルに元は存在しない Authenticode 署名が含まれるためです。

Authenticode PE イメージ ハッシュを生成するプロセス

このセクションでは、PE イメージ ハッシュの計算方法と、Authenticode 署名を無効にせずに PE イメージの部分を変更できる方法について説明します。

注意

特定のファイルの PE イメージハッシュは、ハッシュされたファイル内に属性証明書を含めずに、別のカタログファイルに含めることができます。 これは、実際に Authenticode 署名が含まれていない PE イメージを変更することによって、Authenticode 署名カタログファイル内の PE イメージハッシュを無効にできるようになるためです。

セクションテーブルに指定されている PE イメージのセクション内のすべてのデータは、次の除外範囲を除いて、全体がハッシュされます。

  • 省略可能なヘッダーの Windows 固有のフィールドのファイルチェックサムフィールド。 このチェックサムには、ファイル全体 (ファイル内のすべての属性証明書を含む) が含まれます。 どのような場合でも、チェックサムは Authenticode 署名を挿入した後の元の値とは異なります。

  • 属性証明書に関連する情報。 Authenticode 署名に関連する PE イメージの領域は、イメージの全体的な整合性に影響を与えることなく、イメージに対して Authenticode 署名を追加または削除できるため、PE イメージハッシュの計算には含まれません。 PE イメージの再署名またはタイムスタンプの追加に依存するユーザーシナリオがあるため、これは問題ではありません。 Authenticode は、ハッシュ計算から次の情報を除外します。

    • 省略可能なヘッダーデータディレクトリの証明書テーブルフィールド。

    • 証明書テーブルとそれに対応する証明書で、そのすぐ上に一覧表示される証明書テーブルフィールド。

    PE イメージハッシュを計算するために、Authenticode はセクションテーブルで指定されているセクションをアドレス範囲で並べ替え、その後、結果のバイトシーケンスをハッシュして除外範囲を渡します。

  • 最後のセクションの最後までの情報。 (最大オフセットによって定義された) 最後のセクションを超える領域はハッシュされません。 この領域には、一般的にデバッグ情報が含まれています。 デバッグ情報は、通常、デバッガーにアドバイザリと見なすことができます。実行可能プログラムの実際の整合性には影響しません。 製品の配布後にイメージからデバッグ情報を削除しても、プログラムの機能には影響しません。 実際、これはディスク保存の手段として実行されることもあります。 PE イメージの指定されたセクション内に含まれるデバッグ情報は、Authenticode 署名を invaliding ないと削除できないことに注意してください。

Windows Platform SDK に用意されている makecert および signtool ツールを使用して、Authenticode 署名の作成と検証を試してみることができます。 詳細については、以下の「参照」を参照してください。

リファレンス

Windows 用のダウンロードとツール (Windows SDK を含む)

証明書の作成、表示、および管理

カーネルモードコード署名チュートリアル (.doc)

SignTool

WindowsAuthenticode 移植可能な実行可能ファイルの署名形式 (.docx)

Imagehlp.dll 関数