ELF ファイル形式とは?
.elf 拡張子を持つファイルは、Executable and Linkable Format 標準に従って構造化されたバイナリデータを格納します。これは Linux、ほとんどの Unix 系システム、および多くの組み込みプラットフォームにおけるデフォルトの実行ファイルおよびオブジェクト形式です。この形式は、Unix System Laboratories によって Unix System V Release 4 で導入され、後に Tool Interface Standard (TIS) ポータブル仕様として批准されました。
ELF ファイルには、以下の種類のコンテンツを格納できます:
- アプリケーションやツールの実行ファイル(多くの場合 .bin ファイル として配布されます)
- コンパイル済みオブジェクトファイル(通常は
.o拡張子を持ちます) - 共有ライブラリ(.so 拡張子を持つファイル)
- コアダンプ(プロセスクラッシュ後に生成されるメモリのスナップショット)
この形式は、明確に定義されたバイナリ構造に基づいています。すべての .elf ファイルは、オフセット 0 に 4 バイトのマジックシーケンス 7F 45 4C 46(0x7F に続く ASCII 文字 ELF)で始まり、その後にターゲットアーキテクチャ、ワードサイズ(32ビットまたは 64ビット)、およびバイトオーダー(リトルエンディアンまたはビッグエンディアン)を識別するヘッダーフィールドが続きます。次に、2 つのオプションのテーブル(プログラムヘッダーテーブルとセクションヘッダーテーブル)が、実行時にセグメントをどのようにロードするか、およびリンクのためにセクションがどのように構成されているかを記述します。
ELF 標準は Unix システムを念頭に置いて開発されましたが、PlayStation 2 や Wii などのゲームコンソール、Android、および多くの組み込み環境を含む他のプラットフォームでもすぐに採用されました。標準の MIME タイプは application/x-elf です。.elf ファイルの内容は人間が読める形式ではありません。readelf や objdump(いずれも GNU Binutils の一部)などのツールを使用すると、実行せずにヘッダーを検査したりコードを逆アセンブルしたりできます。
セキュリティと安全性
リスク: HIGH他の実行ファイルと同様に、ELF にはマルウェアが含まれている可能性があります。Linux/IoT ボットネット(Mirai の亜種など)は ELF バイナリとして配布されており、実行されるとユーザーの権限で動作します。信頼できるソースからの ELF ファイルのみを実行してください。安易に «chmod +x» を行ってランダムなダウンロードファイルを実行しないでください。不明な ELF は実行前に readelf/objdump で安全に検査するか、VirusTotal でスキャンしてください。コンソールの自作ソフト .elf ファイルはリスクが低い(エミュレータのサンドボックス内で動作する)ですが、それでも信頼できる自作ソフトソースから入手してください。
形式の詳細
概要ELF ファイルを開くプログラム
技術的詳細
詳細仕様| マジックナンバー | バイトオフセット 0 に `7F 45 4C 46`(0x7F に続く ASCII `ELF`)。すべての有効な ELF ファイルに存在します |
| MIME タイプ | `application/x-elf` |
| ワードサイズのバリエーション | 32ビット (EI_CLASS = `01`) および 64ビット (EI_CLASS = `02`)。ELF ヘッダーのオフセット 4 でエンコードされます |
| バイトオーダーフィールド | オフセット 5 の EI_DATA:`01` = リトルエンディアン、`02` = ビッグエンディアン。ターゲットのハードウェアアーキテクチャによって決定されます |
| ファイルタイプ (e_type) | ET_EXEC (実行ファイル)、ET_REL (再配置可能オブジェクト)、ET_DYN (共有オブジェクトまたは PIE)、ET_CORE (コアdump) |
| ターゲットアーキテクチャ | x86, x86-64, ARM, AArch64, MIPS, RISC-V, PowerPC, SPARC など多数。ELF ヘッダーの `e_machine` フィールドで識別されます |
| OS/ABI 識別子 | オフセット 7 の EI_OSABI バイトがターゲット ABI を指定:0 = System V, 3 = Linux, 9 = FreeBSD, 12 = Solaris |
| 構造レイアウト | ELF ヘッダー → オプションのプログラムヘッダーテーブル(実行時ロードセグメント) → データ → オプションのセクションヘッダーテーブル(リンク時セクション) |
| 主要な名前付きセクション | `.text` (コード), `.data` (初期化済みデータ), `.bss` (ゼロ初期化データ), `.rodata` (定数), `.symtab` / `.dynsym` (シンボル), `.rel` / `.rela` (再配置) |
| 動的リンク | 共有オブジェクトは実行時リンカ (`ld.so`) によってロード時に解決されます。必要なインタプリタのパスは `PT_INTERP` プログラムヘッダーに格納されます |
| デバッグ情報 | DWARF デバッグデータは ELF の `.debug_*` セクションに埋め込まれており、`strip` コマンドで製品バイナリから削除できます |
| 位置独立実行ファイル | PIE バイナリは ET_DYN タイプであり、ASLR をサポートします。Linux カーネルは起動ごとにベースロードアドレスをランダム化します |
| 主な検査ツール | GNU Binutils が提供する `readelf -a` (ヘッダー、シンボル、セクション) および `objdump -d` (逆アセンブル) |
| リリース日 | 1989 (Unix System V Release 4); adopted as the TIS/System V ABI standard |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | refspecs.linuxfoundation.org |
ELF の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。ELF ファイルについて最初の質問をしてみましょう。