Linuxやプログラミングに関する文脈で「ELFファイル」という言葉を目にすることがあります。
この記事では、ELFファイルの基本情報から、開き方、実行方法、内部構造まで詳しく解説します。
ELFファイルとは
ELFファイルは、LinuxやUnix系システムで使用される実行可能ファイル、オブジェクトファイル、共有ライブラリなどのファイル形式です。
正式名称
ELFは「Executable and Linkable Format」(実行可能でリンク可能な形式)の略称です。
かつては「Extensible Linking Format」(拡張可能リンク形式)とも呼ばれていました。
開発の歴史
ELFフォーマットは1990年代初頭に、Unix System V Release 4(SVR4)の一部として開発されました。
それ以前に使われていたa.outフォーマットやCOFFフォーマットの後継として設計されています。
1999年には、86openプロジェクトによってx86プロセッサ上のUnixおよびUnix系システムの標準バイナリファイル形式として採用されました。
ELFファイルの主な用途
ELFフォーマットは、以下のようなファイルに使用されます:
実行可能ファイル(Executable)
Linuxでプログラムを実行する際の実行ファイルです。
拡張子は通常付けられませんが、ファイルとして認識可能です。
オブジェクトファイル(Relocatable)
コンパイル済みだがリンクされていない中間ファイルです。
拡張子は通常.oです。
共有ライブラリ(Shared Object)
複数のプログラムで共有されるライブラリファイルです。
拡張子は通常.soです。
コアダンプファイル(Core)
プログラムが異常終了した際のメモリスナップショットです。
デバッグに使用されます。
ELFファイルの特徴
プラットフォーム非依存性
ELFフォーマットは、異なるCPUアーキテクチャやエンディアン(バイト順序)に対応できる柔軟な設計です。
これにより、x86、ARM、MIPS、PowerPCなど多様なプロセッサで使用できます。
拡張性
新しい機能やデータ構造を追加することが容易な設計となっています。
セクション構造
コード、データ、スタックなどを個別のセクションに分割して管理します。
ELFファイルの構造
ELFファイルは、以下の3つの主要な構成要素から成り立っています:
ELFヘッダ
ファイルの先頭に配置される基本情報です。
含まれる情報:
- マジックナンバー(0x7F、’E’、’L’、’F’)
- アーキテクチャ情報(32ビット/64ビット)
- エンディアン(リトルエンディアン/ビッグエンディアン)
- OS/ABI情報
- ファイルタイプ(実行可能、オブジェクト、共有ライブラリなど)
- エントリポイントアドレス
プログラムヘッダテーブル
実行時に必要なセグメント情報を記述します。
実行可能ファイルや共有ライブラリに含まれます。
セグメントの種類:
- LOADセグメント:メモリにロードされるコードやデータ
- DYNAMICセグメント:動的リンク情報
- INTERPセグメント:インタプリタ(動的リンカ)のパス
セクションヘッダテーブル
リンクやデバッグに使用されるセクション情報を記述します。
主なセクション:
.text:実行可能なコード.data:初期化済みデータ.bss:未初期化データ(ファイルには含まれない).rodata:読み取り専用データ(文字列リテラルなど).symtab:シンボルテーブル.strtab:文字列テーブル
対応OSとシステム
LinuxおよびUnix系OS
- Linux(すべてのディストリビューション)
- FreeBSD、OpenBSD、NetBSD
- Solaris
- macOS(一部、主にダイナミックリンカ)
ゲーム機
- PlayStation(PS1、PS2、PS3、PS4、PS5)
- PlayStation Portable(PSP)
- PlayStation Vita
- Nintendo Wii
- AmigaOS 4
組み込みシステム
- Atmel AVR
- Texas Instruments MSP430
- その他多数の組み込み機器
Windows
Windows自体はELFを標準サポートしていませんが、Windows Subsystem for Linux(WSL)でELFファイルを実行できます。
ELFファイルの開き方・実行方法
Linuxでの実行
Linuxでは、ELFファイルに実行権限を付与することで実行できます。
# 実行権限を付与
chmod +x ファイル名
# 実行
./ファイル名
または、直接実行:
/lib64/ld-linux-x86-64.so.2 ファイル名
Windowsでの扱い方
Windowsでは、ELFファイルをネイティブに実行できません。
以下の方法で対応します:
Windows Subsystem for Linux(WSL)を使用
WSL2をインストールすることで、Windows上でELFファイルを実行できます。
- WSLをインストール
- LinuxディストリビューションをMicrosoft Storeからインストール
- WSL内でELFファイルを実行
仮想マシンを使用
VirtualBoxやVMwareでLinux仮想マシンを作成し、その中でELFファイルを実行します。
エミュレータを使用
QEMUなどのエミュレータを使用して、Linux環境をエミュレートします。
Macでの扱い方
macOSはmach-oフォーマットを使用していますが、一部のツールでELFファイルを解析できます。
実行には、仮想マシンやDockerコンテナを使用するのが一般的です。
ELFファイルの解析ツール
fileコマンド
ファイルの種類を判別するコマンドです。
file /bin/ls
# 出力例:
# /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV)
readelfコマンド
ELFファイルの詳細情報を表示します。
# ELFヘッダを表示
readelf -h ファイル名
# プログラムヘッダを表示
readelf -l ファイル名
# セクションヘッダを表示
readelf -S ファイル名
# シンボルテーブルを表示
readelf -s ファイル名
# すべての情報を表示
readelf -a ファイル名
objdumpコマンド
オブジェクトファイルの情報を表示します。
# アセンブリコードを表示
objdump -d ファイル名
# すべてのヘッダ情報を表示
objdump -x ファイル名
# セクション内容を16進数で表示
objdump -s ファイル名
nmコマンド
シンボル情報を表示します。
# シンボルを表示
nm ファイル名
# 動的シンボルを表示
nm -D ファイル名
lddコマンド
共有ライブラリの依存関係を表示します。
ldd /bin/ls
# 出力例:
# linux-vdso.so.1 (0x00007ffff7ffa000)
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
Windows向けELF解析ツール
Windowsで使用できるELFファイル解析ツールもあります:
XELFViewer
Windows、Linux、macOSで動作するGUIベースのELFファイルビューア/エディタです。
その他のツール
- PE Explorer(ELF対応版)
- IDA Pro(有料、高機能なディスアセンブラ)
- Ghidra(無料、NSA開発のリバースエンジニアリングツール)
WindowsのPEフォーマットとの違い
Windowsでは、ELFの代わりにPE(Portable Executable)フォーマットが使用されます。
主な違い
ヘッダ構造:
- PE:DOSヘッダ、PEシグネチャ、COFFヘッダを含む
- ELF:シンプルなELFヘッダ、プログラムヘッダ、セクションヘッダ
動的リンク:
- PE:インポートテーブルとエクスポートテーブルを使用
- ELF:PLT(Procedure Linkage Table)とGOT(Global Offset Table)を使用
拡張子:
- PE:
.exe、.dll、.sysなど - ELF:通常は拡張子なし、または
.so、.o
ELFファイルに関する注意点
セキュリティ
ELFファイルは実行可能なプログラムであるため、信頼できないソースからダウンロードしたものを実行しないでください。
マルウェアはELFファイルとして配布されることがあります。
パッキング
マルウェアはしばしばELFファイルを「パック」(圧縮・難読化)して配布します。
不審なELFファイルは、高いエントロピーや不規則なセクションサイズなどの異常な特徴を示すことがあります。
アーキテクチャ依存性
ELFファイルは特定のCPUアーキテクチャ用にコンパイルされています。
32ビットELFは32ビットシステムで、64ビットELFは64ビットシステムで実行する必要があります。
実践的な使用例
実行ファイルのアーキテクチャを確認
readelf -h /bin/bash | grep Machine
# 出力例: Machine: Advanced Micro Devices X86-64
依存する共有ライブラリを確認
ldd /usr/bin/python3
シンボル名でシンボルを検索
nm /lib/x86_64-linux-gnu/libc.so.6 | grep malloc
特定のセクションの内容を表示
readelf -x .rodata /bin/ls
まとめ
ELFファイルは、LinuxおよびUnix系システムで使用される標準的な実行ファイル形式です。
重要なポイント:
- Executable and Linkable Formatの略
- 実行ファイル、オブジェクトファイル、共有ライブラリ、コアダンプに使用される
- プラットフォーム非依存で拡張性が高い
- ヘッダ、プログラムヘッダテーブル、セクションヘッダテーブルで構成
- Linuxでは直接実行可能、WindowsではWSLや仮想マシンが必要
- readelf、objdump、nmなどのツールで解析できる
プログラミングやシステム管理、セキュリティ分析を行う上で、ELFファイルの構造を理解することは重要なスキルです。


コメント