ELFファイルとは?開き方・実行方法・構造を詳しく解説

プログラミング・IT

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ファイルを実行できます。

  1. WSLをインストール
  2. LinuxディストリビューションをMicrosoft Storeからインストール
  3. 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ファイルビューア/エディタです。

XELFViewerダウンロード

その他のツール

  • 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ファイルの構造を理解することは重要なスキルです。

参考情報

コメント

タイトルとURLをコピーしました