先に述べたとおり、ELF はオブジェクトファイルの枠組みを提供し、複数のプロセッサ、複数のデータ符号化、複数のクラスのマシンをサポートします。このオブジェクトファイルファミリをサポートできるようファイルの初期バイトは、問い合わせが行われるプロセッサに関係なくかつファイルの残りの内容にも関係なくファイルの解釈方法を指定します。
ELF ヘッダー (とオブジェクトファイル) の初期バイトは、e_ident 構成要素に一致します。
表 7-7 e_ident[ ] 識別インデックス
名前 |
値 |
目的 |
---|---|---|
EI_MAG0 |
0 |
ファイルの識別 |
EI_MAG1 |
1 |
ファイルの識別 |
EI_MAG2 |
2 |
ファイルの識別 |
EI_MAG3 |
3 |
ファイルの識別 |
EI_CLASS |
4 |
ファイルのクラス |
EI_DATA |
5 |
データの符号化 |
EI_VERSION |
6 |
ファイルのバージョン |
EI_PAD |
7 |
パッドバイトの開始 |
EI_NIDENT |
16 |
e_ident[] のサイズ |
次のインデックスは、マジックナンバーを保持するバイトをアクセスします。
ファイルの先頭 4 バイトは、ファイルを ELF オブジェクトファイルとして識別する「マジックナンバー」を保持します。
名前 |
値 |
位置 |
---|---|---|
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 ギガバイトまでのファイルと仮想アドレス空間が存在するマシンをサポートし、また以前に定義した基本タイプを使用します。
クラス ELFCLASS64 は、SPARC などの 64 ビットアーキテクチャに対して使用されます。
バイト e_ident[EI_DATA] は、オブジェクトファイルのプロセッサ固有のデータの符号化を指定します。現在、以下の符号化が定義されています。
名前 |
値 |
意味 |
---|---|---|
ELFDATANONE |
0 |
無効な符号化 |
ELFDATA2LSB |
1 |
図 7-2 を参照 |
ELFDATA2MSB |
2 |
図 7-3 を参照 |
これらの符号化の詳細を以下に示します。他の値は予約され、必要に応じて新しい符号化に割り当てられます。
バイト e_ident[EI_VERSION] は、ELF ヘッダーバージョン番号を指定します。現在この値は、e_version の表 7-5 で説明しているように、EV_CURRENT でなければなりません。
この値は、e_ident の使用されていないバイトの先頭を示します。これらのバイトは保留され、0 に設定されます。オブジェクトファイルを読み取るプログラムは、これらのバイトを無視するべきです。使用されていないバイト列が使用されるようになった場合、EI_PAD の値は変更されます。
ファイルのデータ符号化方式は、ファイルの基本オブジェクトを解釈する方法を指定します。先に述べたとおり、クラス ELFCLASS32 のファイルは、1、2、および 4 バイトを占めるオブジェクトを使用します。定義されている符号化方式の下では、オブジェクトは以下のように表されます。バイト番号は、左上隅に示されています。
ELFDATA2LSB を符号化すると、最下位バイトが最低位アドレスを占める 2 の補数値が指定されます。
ELFDATA2MSB を符号化すると、最上位バイトが最低位アドレスを占める 2 の補数値が指定されます。