ELF はオブジェクトファイルの枠組みを提供し、複数のプロセッサ、複数のデータ符号化、複数のクラスのマシンをサポートします。このオブジェクトファイルファミリをサポートするため、ファイルの初期バイトによりファイルの解釈方法が指定されます。これらの初期バイトは、問い合わせが行われるプロセッサにも、ファイルのほかの内容にも依存しません。
ELF ヘッダーおよびオブジェクトファイル の初期バイトは、e_ident メンバーに一致します。
表 7–3 ELF 識別インデックス
名前 |
値 |
目的 |
---|---|---|
EI_MAG0 |
0 |
ファイルの識別 |
EI_MAG1 |
1 |
ファイルの識別 |
EI_MAG2 |
2 |
ファイルの識別 |
EI_MAG3 |
3 |
ファイルの識別 |
EI_CLASS |
4 |
ファイルのクラス |
EI_DATA |
5 |
データの符号化 |
EI_VERSION |
6 |
ファイルのバージョン |
EI_OSABI |
7 |
オペレーティングシステム / ABI の識別 |
EI_ABIVERSION |
8 |
ABI のバージョン |
EI_PAD |
9 |
パッドバイトの開始 |
EI_NIDENT |
16 |
e_ident[] のサイズ |
次のインデックスは、次の値を保持するバイトにアクセスします。
ファイルを ELF オブジェクトファイルとして識別する 4 バイトの「マジックナンバー」。次の表を参照してください。
名前 |
値 |
位置 |
---|---|---|
ELFMAG0 |
0x7f |
e_ident[EI_MAG0] |
ELFMAG1 |
'E' |
e_ident[EI_MAG1] |
ELFMAG2 |
'L' |
e_ident[EI_MAG2] |
ELFMAG3 |
'F' |
e_ident[EI_MAG3] |
バイト e_ident[EI_CLASS] は、ファイルのクラスまたは容量を示します。次の表にファイルのクラスを示します。
名前 |
値 |
意味 |
---|---|---|
ELFCLASSNONE |
0 |
無効なクラス |
ELFCLASS32 |
1 |
32 ビットオブジェクト |
ELFCLASS64 |
2 |
64 ビットオブジェクト |
ファイル形式は、最大マシンのサイズを最小マシンに押しつけることなしにさまざまなサイズのマシン間で互換性が維持されるように設計されています。ファイルのクラスは、オブジェクトファイルコンテナのデータ構造によって使用される基本タイプを定義します。オブジェクトファイルセクションに含まれるデータは、異なるプログラミングモデルに準拠する場合があります。
クラス ELFCLASS32 は、4 ギガバイトまでのファイルと仮想アドレス空間が存在するマシンをサポートします。このクラスは、表 7–1 で定義される基本タイプを使用します。
クラス ELFCLASS64 は、64 ビット SPARC や x64 などの 64 ビットアーキテクチャー用に予約されています。このクラスは、表 7–2 で定義される基本タイプを使用します。
バイト e_ident[EI_DATA] は、オブジェクトファイルのプロセッサ固有のデータの符号化を指定します (次の表を参照)。
名前 |
値 |
意味 |
---|---|---|
ELFDATANONE |
0 |
無効な符号化 |
ELFDATA2LSB |
1 |
図 7–2 を参照してください。 |
ELFDATA2MSB |
2 |
図 7–3 を参照してください。 |
これらの符号化の詳細は、「データの符号化」で説明します。ほかの値は、将来の使用に備えて保留されます。
バイト e_ident[EI_VERSION] は、ELF ヘッダーバージョン番号を指定します。現在この値は、EV_CURRENT でなければなりません。
バイト e_ident[EI_OSABI] は、オブジェクトのターゲット先となる ABI とともにオペレーティングシステムを識別します。ほかの ELF 構造体内のフィールドの中には、オペレーティングシステム特有または ABI 特有の意味を持つフラグおよび値を保持するものがあります。これらのフィールドの解釈は、このバイトの値によって決定されます。
バイト e_ident[EI_ABIVERSION] は、オブジェクトのターゲット先となる ABI のバージョンを識別します。このフィールドは、ABI の互換性のないバージョンを識別するために使用します。このバージョン番号の解釈は、EI_OSABI フィールドで識別される ABI によって異なります。プロセッサについて EI_OSABI フィールドに値が何も指定されていない場合、または EI_OSABI バイトの特定の値によって決定される ABI についてバージョンの値が何も指定されていない場合は、指定なしを示すものとして値 0 が使用されます。
この値は、e_ident の使用されていないバイトの先頭を示します。これらのバイトは保留され、0 に設定されます。オブジェクトファイルを読み取るプログラムは、これらの値を無視します。