EXEフォーマット

読み:エグゼ・フォーマット
外語:EXE format 英語
品詞:名詞

MS-DOSMicrosoft Windowsなどの実行ファイルなどのフォーマット。16ビット、32ビット、64ビットのいずれの値も利用可能。

目次

EXEフォーマットを用いたファイルをEXEファイルという。EXEファイルは実行ファイルなので、CPUが理解できる機械語の羅列が格納されている。

ただし、実際には機械語だけではなく、必要となる様々な情報もあわせて格納されている。

ファイル名は、拡張子に「.EXE」が使われる。

由来

MS-DOSの祖先にあたるCP/Mの実行ファイル形式「COMファイル」は、ファイルヘッダーを持っておらず、拡張性がなかった。

また、コード、データ、スタックの各セグメントが同一で、開始位置も0100Hに固定化されていた。

このままでは8086の機能を生かすことが出来なかったため、MS-DOSはファイルヘッダーを持ったEXEフォーマットを新たに導入した。

WindowsでもEXEが拡張されて使われ、実行ファイルの他に、DLLVxDその他デバイスドライバー形式のファイルなどにもEXEのファイルフォーマットが使われている。

利用環境

詳細は後述するが、EXEフォーマットは拡張が自在であり、様々な種類が存在する。

使用されるオペレーティングシステムには、次のようなものがある。

OSが異なれば同じ実行ファイルは使えない。

またひとえにWindows用と言っても、Win16と、Win32/Win64/Windows CEで形式が抜本的に異なっている。

主要な種類

  • DOS実行形式 (MZ)
  • New Executable (NE)
  • Linear Executable (LE)
  • Linear Executable (LX)
  • Portable Executable (PE)
  • WIN386.EXE (W3)
  • VMM386.VXD (W4)

構造概要

現在、EXEフォーマットで最も多いのはWindows用のEXEファイルであるので、それを例とする。

そのうち「PE」と呼ばれる、Win32用のファイルは、三つの部分から構成されている。

  • MZスタブ
    • IMAGE_DOS_HEADER構造体
    • MS-DOS用スタブプログラム
  • PEヘッダー
    • "PE\0\0"
    • IMAGE_FILE_HEADER構造体
    • IMAGE_OPTIONAL_HEADER32構造体
      • IMAGE_DATA_DIRECTORY構造体 (16個)
  • セクションデータ

元々MS-DOS用だったものを、拡張してWindowsで使っている。その拡張の一つがPE(Portable Executable)という形式で、UNIXで開発されたCOFFをベースとして作られた。

IMAGE_DOS_HEADER構造体

以下に、Wineのソースwinnt.hより、IMAGE_DOS_HEADER構造体を引用する。WORDは16ビット、DWORDは32ビットである。なお、Visual C++にもほぼ同じ内容の純正版が同じファイル名で存在する。

typedef struct _IMAGE_DOS_HEADER {
    WORD  e_magic;      /* 00: MZ Header signature */
    WORD  e_cblp;       /* 02: Bytes on last page of file */
    WORD  e_cp;         /* 04: Pages in file */
    WORD  e_crlc;       /* 06: Relocations */
    WORD  e_cparhdr;    /* 08: Size of header in paragraphs */
    WORD  e_minalloc;   /* 0a: Minimum extra paragraphs needed */
    WORD  e_maxalloc;   /* 0c: Maximum extra paragraphs needed */
    WORD  e_ss;         /* 0e: Initial (relative) SS value */
    WORD  e_sp;         /* 10: Initial SP value */
    WORD  e_csum;       /* 12: Checksum */
    WORD  e_ip;         /* 14: Initial IP value */
    WORD  e_cs;         /* 16: Initial (relative) CS value */
    WORD  e_lfarlc;     /* 18: File address of relocation table */
    WORD  e_ovno;       /* 1a: Overlay number */
    WORD  e_res[4];     /* 1c: Reserved words */
    WORD  e_oemid;      /* 24: OEM identifier (for e_oeminfo) */
    WORD  e_oeminfo;    /* 26: OEM information; e_oemid specific */
    WORD  e_res2[10];   /* 28: Reserved words */
    DWORD e_lfanew;     /* 3c: Offset to extended header */
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

EXEファイルはCOMファイルとの区別のため、ファイルの先頭2バイトがマジックナンバーとなっており、0x5a4d(ASCIIで'MZ')または0x4d5a(同様に'ZM')のいずれかをe_magicとする。これは、MS-DOS 2.0の開発責任者の一人、Mark Zbikowskiのイニシャルに由来する。

Windowsでは、この構造体の情報は殆ど意味を持たない。なぜなら、e_lfanew以外のメンバーは全て16ビットであり、32ビットや64ビットのアドレス情報などを記述することが出来ないからである。

Windowsで使うのはe_magicとe_lfanewだけで、e_lfanewには後述するPEヘッダーの先頭アドレスを入れる。

MS-DOS用スタブプログラム

EXEファイルが誤ってMS-DOS上で実行された時のためのプログラムが、MS-DOS用スタブプログラムである。

一般的には「This program cannot be run in DOS mode.」といった文字列を表示して終わる、簡単なプログラムである。

理論上は、ここにMS-DOSで機能するプログラムを入れれば、一つのファイルでMS-DOS・Windows共用の実行ファイルが出来る(はず)。

PEヘッダー

PE(Portable Executable)ヘッダーは、IMAGE_NT_HEADERS32構造体で定義されている。

以下に、WINEのソースwinnt.hより、IMAGE_NT_HEADERS32構造体を引用する。

typedef struct _IMAGE_NT_HEADERS {
  DWORD Signature; /* "PE"\0\0 */              /* 0x00 */
  IMAGE_FILE_HEADER FileHeader;                /* 0x04 */
  IMAGE_OPTIONAL_HEADER32 OptionalHeader;      /* 0x18 */
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signatureは、PEヘッダーを表わすマジックナンバー「0x00004550」がリトルエンディアンで格納されている。

IMAGE_FILE_HEADER構造体がPEヘッダーのヘッダー情報になる。

続いてIMAGE_OPTIONAL_HEADER32構造体があり、この中に更にIMAGE_DATA_DIRECTORY構造体が16個定義されている。

IMAGE_FILE_HEADERヘッダー

以下に、WINEのソースwinnt.hより、IMAGE_FILE_HEADER構造体を引用する。

typedef struct _IMAGE_FILE_HEADER {
  WORD  Machine;
  WORD  NumberOfSections;
  DWORD TimeDateStamp;
  DWORD PointerToSymbolTable;
  DWORD NumberOfSymbols;
  WORD  SizeOfOptionalHeader;
  WORD  Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

Machineは、CPUの種類など、想定する環境を指定する番号である。

番号はCOFFと共通で、Microsoftの公式文書PE Formatによると、次のような番号が定義されている。

  • IMAGE_FILE_MACHINE_UNKNOWN = 0x0
  • IMAGE_FILE_MACHINE_AM33 = 0x01d3
  • IMAGE_FILE_MACHINE_AMD64 = 0x8664
  • IMAGE_FILE_MACHINE_ARM = 0x01c0
  • IMAGE_FILE_MACHINE_ARM64 = 0xaa64
  • IMAGE_FILE_MACHINE_ARMNT = 0x01c4
  • IMAGE_FILE_MACHINE_EBC = 0x0ebc
  • IMAGE_FILE_MACHINE_I386 = 0x014c
  • IMAGE_FILE_MACHINE_IA64 = 0x0200
  • IMAGE_FILE_MACHINE_M32R = 0x9041
  • IMAGE_FILE_MACHINE_MIPS16 = 0x0266
  • IMAGE_FILE_MACHINE_MIPSFPU = 0x0366
  • IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466
  • IMAGE_FILE_MACHINE_POWERPC = 0x01f0
  • IMAGE_FILE_MACHINE_POWERPCFP = 0x01f1
  • IMAGE_FILE_MACHINE_R4000 = 0x0166
  • IMAGE_FILE_MACHINE_RISCV32 = 0x5032
  • IMAGE_FILE_MACHINE_RISCV64 = 0x5064
  • IMAGE_FILE_MACHINE_RISCV128 = 0x5128
  • IMAGE_FILE_MACHINE_SH3 = 0x01a2
  • IMAGE_FILE_MACHINE_SH3DSP = 0x01a3
  • IMAGE_FILE_MACHINE_SH4 = 0x01a6
  • IMAGE_FILE_MACHINE_SH5 = 0x01a8
  • IMAGE_FILE_MACHINE_THUMB = 0x01c2
  • IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169

つまり、一般的なWindowsアプリケーションであれば、次のどれかということになる。

  • IMAGE_FILE_MACHINE_I386 = 0x014c (x86、32ビットアプリ)
  • IMAGE_FILE_MACHINE_IA64 = 0x0200 (Itanium、黒歴史)
  • IMAGE_FILE_MACHINE_AMD64 = 0x8664 (x64、64ビットアプリ)
用語の所属
実行ファイル
EXE
MZ
関連する用語
EXEファイル
.EXE
.COM

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club