リンカーとライブラリ

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_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 ギガバイトまでのファイルと仮想アドレス空間が存在するマシンをサポートし、また以前に定義した基本タイプを使用します。

クラス ELFCLASS64 は、SPARCV9 などの 64 ビットアーキテクチャに対して使用されます。

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_PAD

この値は、e_ident の使用されていないバイトの先頭を示します。これらのバイトは保留され、0 に設定されます。オブジェクトファイルを読み取るプログラムは、これらのバイトを無視するべきです。使用されていないバイト列が使用されるようになった場合、EI_PAD の値は変更されます。

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

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

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

Graphic

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

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

Graphic