リンカーとライブラリ

ELF 識別

ELF はオブジェクトファイルの枠組みを提供し、複数のプロセッサ、複数のデータ符号化、複数のクラスのマシンをサポートします。このオブジェクトファイルファミリをサポートするため、ファイルの初期バイトによりファイルの解釈方法が指定されます。これらの初期バイトは、問い合わせが行われるプロセッサにも、ファイルの他の内容にも依存しません。

ELF ヘッダーおよびオブジェクトファイル の初期バイトは、e_ident 構成要素に一致します。

表 7–7 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[] のサイズ

これらのインデックスは、次に示す値を保持するバイトにアクセスします。

EI_MAG0 - EI_MAG3

ファイルを ELF オブジェクトファイルとして識別する 4 バイトの「マジックナンバー」(次の表を参照)。

表 7–8 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]

EI_CLASS

バイト e_ident[EI_CLASS] は、ファイルのクラスまたは容量を示します。次の表にファイルのクラスを示します。

表 7–9 ELF ファイルのクラス

名前 

値 

意味 

ELFCLASSNONE

0

無効なクラス 

ELFCLASS32

1

32 ビットオブジェクト 

ELFCLASS64

2

64 ビットオブジェクト 

ファイル形式は、最大マシンのサイズを最小マシンに押しつけることなしにさまざまなサイズのマシン間で互換性が維持されるように設計されています。ファイルのクラスは、オブジェクトファイルそのもののデータ構造によって使用される基本タイプを定義します。オブジェクトファイルセクションに含まれるデータは、異なるプログラミングモデルに準拠する場合があります。

クラス ELFCLASS32 は、4 ギガバイトまでのファイルと仮想アドレス空間が存在するマシンをサポートします。これは、表 7–1 で定義される基本タイプを使用します。

クラス ELFCLASS64 は、SPARC などの 64 ビットアーキテクチャに対して使用されます。これは、表 7–2 で定義される基本タイプを使用します。

EI_DATA

バイト e_ident[EI_DATA] は、オブジェクトファイルのプロセッサ固有のデータの符号化を指定します (次の表を参照)。

表 7–10 ELF データの符号化

名前 

値 

意味 

ELFDATANONE

0

無効な符号化 

ELFDATA2LSB

1

図 7–2 を参照

ELFDATA2MSB

2

図 7–3 を参照

これらの符号化の詳細は、データの符号化 で説明します。他の値は予約され、必要に応じて新しい符号化に割り当てられます。

EI_VERSION

バイト e_ident[EI_VERSION] は、ELF ヘッダーバージョン番号を指定します。現在この値は、EV_CURRENT でなければなりません。

EI_OSABI

バイト e_ident[EI_OSABI] は、オブジェクトのターゲット先となるオペレーティングシステムおよび ABI を識別します。他の ELF 構造体内のフィールドの中には、オペレーティンシステム特有または ABI 特有の意味を持つフラグおよび値を保持するものがあります。これらのフィールドの解釈は、このバイトの値によって決定されます。

EI_ABIVERSION

バイト e_ident[EI_ABIVERSION] は、オブジェクトのターゲット先となる ABI のバージョンを識別します。このフィールドは、ABI の互換性の無いバージョンを識別するために使用します。このバージョン番号の解釈は、EI_OSABI フィールドで識別される ABI によって異なります。プロセッサについて EI_OSABI フィールドに値が何も指定されていない場合、または EI_OSABI バイトの特定の値によって決定される ABI についてバージョンの値が何も指定されていない場合は、「指定なし」を示すものとして値 0 が使用されます。

EI_PAD

この値は、e_ident の使用されていないバイトの先頭を示します。これらのバイトは保留され、0 に設定されます。オブジェクトファイルを読み取るプログラムは、これらのバイトを無視する必要があります。