Executable and Linkable Format (ELF) は、
実行ファイルや
オブジェクトファイルのための
ファイルフォーマットです。これは、かつて主流であった a.out フォーマットや COFF フォーマットの後継として広く利用されており、
コンテナフォーマットの一種として分類されます。ELF の特徴は、その柔軟性にあります。セクション数の制限が緩く、メモリ上で連続していないファイルや、ロードされる場所と実行される場所が異なるようなファイルにも対応できる設計となっています。
ELF は System V で採用された後、GNU ツールチェーンによってサポートされるようになりました。現在では、BSD 派生 OS や
Linux などのフリーな OS における実行
ファイルフォーマットとしてだけでなく、ゲーム機を含む組み込み機器の開発にも広く使用されています。
ELF のヘッダ
ELF には、以下の 3 種類のヘッダが存在します。
1.
ELF ヘッダ: ファイルの先頭に位置し、ELF ファイルの識別子、アーキテクチャ情報、そして他の 2 つのヘッダへの情報を持っています。
2.
プログラムヘッダ: ファイル上のどの部分(セグメント)が、どのような属性で、どこに読み込まれるかを定義するヘッダです。ファイルローダによって処理され、実行時に ELF ヘッダに続いてディスクから読み込まれるセグメントの数だけ存在します。ただし、
オブジェクトファイルのように直接読み込まれないファイルには、プログラムヘッダが存在しない場合があります。
3.
セクションヘッダ:
オブジェクトファイルの論理的な構造を記述する部分です。一般的に、リンカや
デバッガなど、
バイナリの実行以外の目的で ELF ファイルにアクセスするツールが使用します。実行時には必ずしも必要ではない情報が多いため、ヘッダという名前が付いていますが、実際にはファイルの最後の方に配置されることが多いです。
各セクションには通常、セクション名が付けられています。セクション名の文字列は、ELF ヘッダで指定された文字列専用セクションに、ヌル終端された文字列として格納されます。セクション名は、この専用セクションの先頭からのオフセットによって指定されます。これにより、エントリ自体は固定長に保ちつつ、セクション名の長さ制限をなくすことができます。オフセットは、文字列専用セクション内の文字列の途中を指すことも可能で、サフィックスが重複する文字列をまとめて記述できます。
共有ライブラリ
ELF は、共有ライブラリにも対応しています。共有ライブラリは、適切な属性を持つセグメント内の Procedure Location Table (PLT) や Global Offset Table (GOT) を利用して間接的に参照されます。これにより、複数のプログラムで同じライブラリを共有することができ、メモリ使用量の削減やプログラムの効率化に貢献します。
デバッグ情報ファイル
デバッグ情報のフォーマットは ELF 仕様では定義されていませんが、一般的には ELF(妖精)をもじった Debug With Arbitrary Record Format、略して DWARF(小人)という形式のフォーマットがよく用いられます。DWARF は、デバッグに必要な情報を効率的に記録するための形式であり、
デバッガなどのツールがプログラムの実行を解析する際に役立ちます。
注
ELF は、
実行ファイルおよび
オブジェクトファイルにおける事実上の標準フォーマットとして、広く利用されています。その柔軟性と拡張性の高さから、さまざまなプラットフォームや環境で採用されており、ソフトウェア開発において重要な役割を果たしています。
関連項目
実行ファイル形式
位置独立コード
外部リンク
*
elf(5) – JM Project Linux File Formats マニュアル