いくつかのオブジェクトファイル制御構造は大きくなることがありまが、その大きさは ELF ヘッダーに記録されます。オブジェクトファイルの形式が変わった場合、ELF 形式のファイルにアクセスするプログラムは、大きくなったり小さくなったりした制御構造体を扱うことになります。大きくなった場合は、追加された部分を無視することができるかもしれません。小さくなった場合は、無くなった部分の扱いは状況に依存しますし、形式が変更された時に規定されるでしょう。
ELF ヘッダーの構造体 (sys/elf.h で定義されている) は、以下のとおりです。
#define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr; typedef struct { unsigned char e_ident[EI_NIDENT]; Elf64_Half e_type; Elf64_Half e_machine; Elf64_Word e_version; Elf64_Addr e_entry; Elf64_Off e_phoff; Elf64_Off e_shoff; Elf64_Word e_flags; Elf64_Half e_ehsize; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64_Half e_shstrndx; } Elf64_Ehdr; |
先頭のバイト列に、オブジェクトファイルであることを示す印と、機種に依存しない、ファイルの内容を復号化または解釈するためのデータが入ります。完全な記述は、「ELF 識別」で行われています。
この構成要素は、オブジェクトファイルの種類を示します。
名前 |
値 |
意味 |
---|---|---|
ET_NONE |
0 |
ファイルタイプが存在しない |
ET_REL |
1 |
再配置可能ファイル |
ET_EXEC |
2 |
実行可能ファイル |
ET_DYN |
3 |
共有オブジェクトファイル |
ET_CORE |
4 |
コアファイル |
ET_LOPROC |
0xff00 |
プロセッサに固有 |
ET_HIPROC |
0xffff |
プロセッサに固有 |
コアファイルの内容は指定されていませんが、ET_CORE タイプはコアファイルを示すために予約されます。ET_LOPROC から ET_HIPROC までの値 (それぞれを含む) は、プロセッサ固有の方法で解釈されます。他の値は予約され、必要に応じて新しいオブジェクトファイルの種類に割り当てられます。
この構成要素の値は、個々のファイルが必要とするアーキテクチャを指定します。
名前 |
値 |
意味 |
---|---|---|
EM_NONE |
0 |
マシンが存在しない |
EM_M32 |
1 |
AT&T WE 32100 |
EM_SPARC |
2 |
SPARC |
EM_386 |
3 |
Intel 80386 |
EM_68K |
4 |
Motorola 68000 |
EM_88K |
5 |
Motorola 88000 |
EM_486 |
6 |
Intel 80486 |
EM_860 |
7 |
Intel 80860 |
EM_MIPS |
8 |
MIPS RS3000 Big-Endian |
EM_MIPS_RS3_LE |
10 |
MIPS RS3000 Little-Endian |
EM_RS6000 |
11 |
RS6000 |
EM_PA_RISC |
15 |
PA-RISC |
EM_nCUBE |
16 |
nCUBE |
EM_VPP500 |
17 |
Fujitsu VPP500 |
EM_SPARC32PLUS |
18 |
Sun SPARC 32+ |
EM_PPC |
20 |
PowerPC |
EM_SPARCV9 |
43 |
SPARC V9 |
他の値は予約され、必要に応じて新しい機種に割り当てられます。プロセッサ固有の ELF 名の識別には、機種名が使用されます。たとえば、以下に述べるフラグでは接頭辞 EF_ が使用されます。EM_XYZ マシンの WIDGET というフラグは、EF_XYZ_WIDGET と呼ばれます。
この構成要素は、オブジェクトファイルのバージョンを示します。
名前 |
値 |
意味 |
---|---|---|
EV_NONE |
0 |
無効なバージョン |
EV_CURRENT |
>=1 |
現バージョン |
値 1 は最初のファイル形式を示し、拡張した場合は番号を大きくします。EV_CURRENT の値は、現バージョン番号を示すために必要に応じて変化します。
この構成要素は、システムが制御を最初に渡す仮想アドレスを保持します。仮想アドレスが与えられると、プロセスが起動されます。ファイルに関連する入り口点が存在しない場合、この構成要素は 0 を保持します。
この構成要素は、プログラムヘッダーテーブルのファイルオフセット (単位 : バイト) を保持します。ファイルにプログラムヘッダーテーブルが存在しない場合、この構成要素は 0 を保持します。
この構成要素は、セクションヘッダーテーブルのファイルオフセット (単位 : バイト) を保持します。ファイルにセクションヘッダーテーブルが存在しない場合、この構成要素は 0 を保持します。
この構成要素は、ファイルに対応付けられているプロセッサ固有のフラグを保持します。フラグ名は、EF_machine「_flag」という形式をとります。この構成要素は現在、SPARC と IA に対して 0 です。
表 7-6 SPARC: ELF フラグ
名前 |
値 |
意味 |
---|---|---|
EF_SPARCV9_MM |
0x3 |
メモリーモデルのマスク |
EF_SPARCV9_TSO |
0x0 |
Total Store Ordering |
EF_SPARCV9_PSO |
0x1 |
Partial Store Ordering |
EF_SPARCV9_RMO |
0x2 |
Relaxed Memory Ordering |
EF_SPARC_EXT_MASK |
0xffff00 |
ベンダー拡張マスク |
EF_SPARC_SUN_US1 |
0x000200 |
Sun UltraSPARC 1 拡張 |
EF_SPARC_HAL_R1 |
0x000400 |
HAL R1 拡張 |
EF_SPARC_SUN_US3 |
0x000800 |
Sun UltraSPARC 3 拡張 |
この構成要素は、ELF ヘッダーのサイズ (単位 : バイト) を保持します。
この構成要素は、ファイルのプログラムヘッダーテーブルの 1 つのエントリのサイズ (単位 : バイト) を保持します。すべてのエントリは同じサイズです。
この構成要素は、プログラムヘッダーテーブルのエントリ数を保持します。したがって、e_phentsize に e_phnum を掛けると、テーブルのサイズ (単位 : バイト) が求められます。ファイルにプログラムヘッダーテーブルが存在しない場合、e_phnum は値 0 を保持します。
この構成要素は、1 つのセクションヘッダーのサイズ (単位 : バイト) を保持します。1 つのセクションヘッダーは、セクションヘッダーテーブルの 1 つのエントリです。すべてのエントリは同じサイズです。
この構成要素は、セクションヘッダーテーブルのエントリ数を保持します。したがって、e_shentsize に e_shnum を掛けると、セクションヘッダーテーブルのサイズ (単位 : バイト) が求められます。ファイルにセクションヘッダーテーブルが存在しない場合、e_shnum は値 0 を保持します。
この構成要素は、セクション名文字列テーブルに対応するエントリのセクションヘッダーテーブルインデックスを保持します。ファイルにセクション名文字列テーブルが存在しない場合、この構成要素は値 SHN_UNDEF を保持します。詳細は、「セクション」と 「文字列テーブル」を参照してください。