リンカーとライブラリ

ELF 識別

先に述べたとおり、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_OSABI

7

オペレーティングシステム / ABI の識別

EI_ABIVERSION

8

ABI のバージョン

EI_PAD

7

パッドバイトの開始 

EI_NIDENT

16

e_ident[] のサイズ

次のインデックスは、マジックナンバーを保持するバイトをアクセスします。

EI_MAG0 - EI_MAG3

ファイルの先頭 4 バイトは、ファイルを ELF オブジェクトファイルとして識別する「マジックナンバー」を保持します。

表 7-8 マジックナンバー

名前 

値 

位置 

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 ファイルクラス

名前 

値 

意味 

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 データの符号化

名前 

値 

意味 

ELFDATANONE

0

無効な符号化 

ELFDATA2LSB

1

図 7-2 を参照

ELFDATA2MSB

2

図 7-3 を参照

これらの符号化の詳細を以下に示します。他の値は予約され、必要に応じて新しい符号化に割り当てられます。

EI_VERSION

バイト e_ident[EI_VERSION] は、ELF ヘッダーバージョン番号を指定します。現在この値は、e_version表 7-5 で説明しているように、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 に設定されます。オブジェクトファイルを読み取るプログラムは、これらのバイトを無視するべきです。使用されていないバイト列が使用されるようになった場合、EI_PAD の値は変更されます。

ファイルのデータ符号化方式は、ファイル内の基本オブジェクトを解釈する方法を指定します。クラス ELFCLASS32 のファイルは、1、2、および 4 バイトを占めるオブジェクトを使用します。クラス ELFCLASS64 のファイルは、1、2、4、および 8 バイトを占めるオブジェクトを使用します。定義されている符号化方式の下では、オブジェクトは以下のように表されます。バイト番号は、左上隅に示されています。

ELFDATA2LSB を符号化すると、最下位バイトが最低位アドレスを占める 2 の補数値が指定されます。

図 7-2 データの符号化方法 ELFDATA2LSB

Graphic

ELFDATA2MSB を符号化すると、最上位バイトが最低位アドレスを占める 2 の補数値が指定されます。

図 7-3 データの符号化方法 ELFDATA2MSB

Graphic