リンカーとライブラリ

ELF ヘッダー

いくつかのオブジェクトファイル制御構造は大きくなることがありまが、その大きさは 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;
e_ident

先頭のバイト列に、オブジェクトファイルであることを示す印と、機種に依存しない、ファイルの内容を復号化または解釈するためのデータが入ります。完全な記述は、「ELF 識別」で行われています。

e_type

この構成要素は、オブジェクトファイルの種類を示します。

表 7-3 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 までの値 (それぞれを含む) は、プロセッサ固有の方法で解釈されます。他の値は予約され、必要に応じて新しいオブジェクトファイルの種類に割り当てられます。

e_machine

この構成要素の値は、個々のファイルが必要とするアーキテクチャを指定します。

表 7-4 ELF 機種

名前 

値 

意味 

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 と呼ばれます。

e_version

この構成要素は、オブジェクトファイルのバージョンを示します。

表 7-5 ELF バージョン

名前 

値 

意味 

EV_NONE

0

無効なバージョン 

EV_CURRENT

>=1

現バージョン 

値 1 は最初のファイル形式を示し、拡張した場合は番号を大きくします。EV_CURRENT の値は、現バージョン番号を示すために必要に応じて変化します。

e_entry

この構成要素は、システムが制御を最初に渡す仮想アドレスを保持します。仮想アドレスが与えられると、プロセスが起動されます。ファイルに関連する入り口点が存在しない場合、この構成要素は 0 を保持します。

e_phoff

この構成要素は、プログラムヘッダーテーブルのファイルオフセット (単位 : バイト) を保持します。ファイルにプログラムヘッダーテーブルが存在しない場合、この構成要素は 0 を保持します。

e_shoff

この構成要素は、セクションヘッダーテーブルのファイルオフセット (単位 : バイト) を保持します。ファイルにセクションヘッダーテーブルが存在しない場合、この構成要素は 0 を保持します。

e_flags

この構成要素は、ファイルに対応付けられているプロセッサ固有のフラグを保持します。フラグ名は、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 拡張 

e_ehsize

この構成要素は、ELF ヘッダーのサイズ (単位 : バイト) を保持します。

e_phentsize

この構成要素は、ファイルのプログラムヘッダーテーブルの 1 つのエントリのサイズ (単位 : バイト) を保持します。すべてのエントリは同じサイズです。

e_phnum

この構成要素は、プログラムヘッダーテーブルのエントリ数を保持します。したがって、e_phentsizee_phnum を掛けると、テーブルのサイズ (単位 : バイト) が求められます。ファイルにプログラムヘッダーテーブルが存在しない場合、e_phnum は値 0 を保持します。

e_shentsize

この構成要素は、1 つのセクションヘッダーのサイズ (単位 : バイト) を保持します。1 つのセクションヘッダーは、セクションヘッダーテーブルの 1 つのエントリです。すべてのエントリは同じサイズです。

e_shnum

この構成要素は、セクションヘッダーテーブルのエントリ数を保持します。したがって、e_shentsizee_shnum を掛けると、セクションヘッダーテーブルのサイズ (単位 : バイト) が求められます。ファイルにセクションヘッダーテーブルが存在しない場合、e_shnum は値 0 を保持します。

e_shstrndx

この構成要素は、セクション名文字列テーブルに対応するエントリのセクションヘッダーテーブルインデックスを保持します。ファイルにセクション名文字列テーブルが存在しない場合、この構成要素は値 SHN_UNDEF を保持します。詳細は、「セクション」「文字列テーブル」を参照してください。