Portable Executable
Portable Executable(PE)は、主に32ビットおよび64ビット版のMicrosoft Windows上で使用される実行ファイル (EXE)、オブジェクトファイル、DLL、SYS (デバイスドライバ)、FON フォントファイル等のファイルフォーマットである。PEフォーマットは実行コードを管理するためにWindows OSローダが必要とする情報をカプセル化するデータ構造である。エクステンシブル・ファームウェア・インターフェイス (EFI) の仕様ではPEをEFI環境における標準の実行形式としている[2]。このためUEFIアプリケーションや.NETアプリケーションのバイナリフォーマットとしても使用されている。マイクロソフト製OSとのマルチブート環境の構築を容易にする目的で、x86、x86-64、ARMアーキテクチャにおけるLinuxカーネル実行ファイル(EFI Boot Stub)[3]やブートローダなど、非Windows系OSのシステムファイルの一部でも用いられている。
拡張子 | .acm, .ax, .cpl, .dll, .drv, .efi, .exe, .fon, .mui, .ocx, .scr, .sys, .tsp |
---|---|
MIMEタイプ | application/vnd.microsoft.portable-executable[1] |
マジック ナンバー | MZ 0x00(×10) PE 0x00 0x00 |
開発者 | マイクロソフト |
種別 | バイナリ、実行可能、オブジェクト、共有ライブラリ |
派生元 | DOS MZ executable COFF |
Windows NTオペレーティングシステムでは、PEはIA-32、IA-64、x86、x86-64 (AMD64/Intel 64)、ARMおよびARM64命令セットアーキテクチャ (ISA) がサポートされている。Windows 2000以前のWindows NTではMIPS、 AlphaおよびPowerPC命令セットアーキテクチャがサポートされていた。PEはWindows CEでも利用されていたため、MIPSのいくつかの種類、ARM (Thumbを含む)、SuperH命令セットアーキテクチャでもサポートが継続されている[4]。
さまざまなCPUアーキテクチャに対応するため、内部に判別用のフラグを持っている。実行時にDLLを動的にリンクし、コンポーネントレベルでのバグフィックス、互換性の維持が行われるようになっている。また、リソース領域にアイコン等を格納でき、GUI上で表示された場合アイコンがグラフィカルに表示され、ソフトウェアが容易に判別できるようにできる。
PEと似たフォーマットとしてELFファイル(LinuxやUnixで利用)や Mach-O (macOSやiOSで利用)がある。
歴史
編集マイクロソフトはWindows NT 3.1オペレーティングシステムの登場とともにPEフォーマットに移行した。Windows 95/98/ME や Windows 3.1x上のWin32sをはじめとする、その後のWindowsはすべてPEをサポートしている。DOSとNTシステムのEXEフォーマットとの互換性を持たせるため、PE/COFFヘッダーにはMS-DOSプログラムがバイナリの先頭に組み込まれている。PEバイナリをMS-DOS上で起動させると、そのMS-DOSプログラムのほうが実行される。特に指定の無い場合、「This program cannot be run in DOS mode.」のような「DOSでは実行できない」というメッセージが表示するだけのプログラムが組み込まれる[5]。MS-DOSプログラムの後ろに、PE固有の識別子と、COFFに似たデータ構造があり、MS-DOSヘッダによってそのオフセットが指されている。
引き続きファットバイナリの形式である。PEは.NET PE形式や、PE32+ (もしくはPE+)と呼ばれる64ビットバージョン、およびWindows CE形式など、Windowsプラットフォームの変更にも対応し続けている。
対応する命令セットアーキテクチャ
編集- x86:i386以降のインテルおよび互換CPUのアーキテクチャ。PEにおいては、その中でも32ビットのコードを対象としている。x86を対象とするWindowsアプリケーションが格納されたPEは、x86版、x86-64版、IA-64版Windowsで直接実行できる。ARM版Windowsにおいてはエミュレーションによって実行できる。Windows NT 4.0においては、Alpha、MIPS、PowerPC版においてエミュレータが存在した[6]。Xboxにおいては、ビルド途中の中間形式として採用されている[7]。i386版のUEFIアプリケーションの記述にも用いられている。
- x86-64: 64ビット対応のx86命令。x64版Windowsで実行できる。x86-64版のUEFIアプリケーションの記述にも用いられている。
- IA-64
- Alpha: Alphaプロセッサ上で動作するWindows NTでのみ実行できる。Alpha版Windowsはすでに開発が終了している。
- MIPS: Windows CE、Windows NTでサポートされていた。
- PowerPC: PowerPC版Windows NTでのみ実行できる。Xbox 360でも内部的な形式として用いられている[8]。
- SH-3/4: Windows CEがサポートするアーキテクチャ。
- ARM: Windows CE、Windows RT、Windows 10でサポートされている。
- AArch64 (ARM64): Windows 10でサポートされている。
技術的詳細
編集他のオペレーティングシステムでの利用状況
編集PEフォーマットはWindowsとのバイナリ互換を謳っているReactOSでも利用されている。過去にはSkyOSやBeOS R3等いくつかのオペレーティングシステムで利用されていたが、SkyOSもBeOSも最終的にはELFへ移行した。
Mono開発環境はMicrosoft .NET Frameworkとのバイナリ互換を謳っており、マイクロソフトの実装と同じPEフォーマットを利用している。
x86 Unix系 オペレーティングシステムでは、Windowsバイナリ(PEフォーマット)はWineを通して実行できる。HX DOS ExtenderもDOS 32ビットバイナリにPEフォーマットを利用しており、一部の既存WindowsバイナリをDOSで実行できるため、DOS版Wineとして利用できる。
IA-32とx86-64のLinuxでは、WindowsのDLLをloadlibraryで利用できる[9]。
Mac OS X 10.5はPEファイルの読み込みと解析が可能だが、Windowsとバイナリ互換はない[10]。
脚注
編集- ^ Andersson, Henrik (2015年4月23日). “application/vnd.microsoft.portable-executable” (英語). IANA. 2017年3月26日閲覧。
- ^ “UEFI 仕様書 version 2.4”. 2019年7月17日閲覧。,p.18のノートに「このイメージ形式を選択することでUEFIイメージにThumbおよびThumb-2命令セットを含めつつEFIインターフェイス自身をARMモードにする」とある。
- ^ “The EFI Boot Stub”. The Linux Kernel Archives. 2019年7月17日閲覧。
- ^ “PE Format (Windows)”. 2017年10月21日閲覧。
- ^ “PE Format” (2019年3月18日). 2019年7月17日閲覧。 “The linker places a default stub here, which prints out the message "This program cannot be run in DOS mode" when the image is run in MS-DOS.”
- ^ 西川和久 (1996年5月7日). “技術者必見!!Part2 Windows NT 4.0のあまり知られていない事実”. Impress PC Watch. 2019年7月17日閲覧。
- ^ Myria (2004年11月25日). “[PATCH] Xbox PE subsystem support”. Narkive. 2019年7月17日閲覧。 “It is known that Microsoft's own Xbox Development Kit (XDK) compiles developers' games into standard PE format, with subsystem 14. The resulting PE file is later converted to the PE-like "XBE" format.”
- ^ Vanik, Ben (2011年2月28日). “Building an Xbox 360 Emulator, part 3: Feasibility/OS”. Various Oddities. 2019年7月17日閲覧。 “On the 360 these are XEX files, which are packages that contain a bunch of resources detailing a game as well as an embedded PE-formatted EXE/DLL file containing the actual code.”
- ^ https://github.com/taviso/loadlibrary
- ^ Chartier, David (2007年11月30日). “Uncovered: Evidence that Mac OS X could run Windows apps soon”. Ars Technica. 2007年12月3日閲覧。 “... Steven Edwards describes the discovery that Leopard apparently contains an undocumented loader for Portable Executables, a type of file used in 32-bit and 64-bit versions of Windows. More poking around revealed that Leopard's own loader tries to find Windows DLL files when attempting to load a Windows binary.”