ELF(5) FreeBSD ファイルフォーマットマニュアル ELF(5)
名称
elf − ELF 実行形式バイナリファイルのフォーマット |
書式
#include <elf.h> |
解説
ヘッダファイル <elf.h> は、ELF 実行形式バイナリファイルのフォーマットを定 義しています。 ELF には普通の実行可能ファイル、再配置可能なオブジェクト ファイル、コアファイル、共有ライブラリがあります。 ELF ファイルフォーマットを使っている実行可能ファイルは ELF ヘッダを持ちま す。そして、プログラムヘッダテーブルか、セクションヘッダテーブル、あるい はその両方が続きます。 ELF ヘッダは、常にファイルのオフセット 0 にありま す。プログラムヘッダテーブルとセクションヘッダテーブルのファイル中のオフ セットは、 ELF ヘッダで定義されています。 2 つのテーブルは、ファイルの特 徴の残りの部分を記述します。 ネイティブアーキテクチャの ELF バイナリファイルを処理するアプリケーション は、そのソースコードに <elf.h> をインクルードするだけですみます。これらの アプリケーションは、総称名 ‘‘Elf_xxx’’ による全タイプと構造体への参照を含 む必要があり、 ‘‘ELF_xxx’’ によるマクロへの参照を含む必要があるでしょう。 このようにして記述されたアプリケーションは、どのようなアーキテクチャで あっても、ホストが 32 ビットなのか、あるいは 64 ビットなのかということを 気にしないで、コンパイル可能です。 未知のアーキテクチャの ELF ファイルを処理する必要があるアプリケーション は、 <elf.h> ではなく、 <sys/elf32.h> と <sys/elf64.h> の両方をインクルー ドする必要があります。さらに、全てのタイプと構造体は、 ‘‘Elf32_xxx’’ か ‘‘Elf64_xxx’’ によって区別する必要があります。マクロは、 ‘‘ELF32_xxx’’ ま たは ‘‘ELF64_xxx’’ によって区別する必要があります。 システムのアーキテクチャがたとえ何であっても、常に <sys/elf_generic.h> だ けでなく、 <sys/elf_common.h> もインクルードします。 これらのヘッダファイルでは、上で言及したヘッダを C 構造体として記述し、こ れに加えて動的セクションと再配置セクションとシンボルテーブルのための構造 体を含んでいます。 以下のタイプが、32 ビットアーキテクチャのために使われています: |
符号無しプログラムアドレス |
||||
符号無しハーフワードフィールド |
||||
符号無しファイルオフセット |
||||
符号付き大整数 |
||||
フィールドまたは符号無し大整数 |
||||
符号無しオブジェクトサイズ |
64 ビットアーキテクチャ用に以下のタイプが用意されています: Elf64_Addr 符号無しプログラムアドレス |
符号無しハーフワードフィールド |
||||
符号無しファイルオフセット |
||||
符号付き大整数 |
||||
フィールドまたは符号無し大整数 |
||||
符号無しオブジェクトサイズ |
||||
符号無しクォータワードフィールド |
ELF ファイルフォーマットが定義する全てのデータ構造は、関連するクラスのた めに ‘‘自然な’’ サイズと境界調整のガイドラインに従っています。必要なら ば、データ構造は、4 バイトオブジェクトが 4 バイト境界となることを保証する ために、構造体のサイズを強制的に 4 の倍数にするとかいった手段で、明示的な パディングを含めます。 ELF ヘッダは、Elf32_Ehdr 型または Elf64_Ehdr 型によって記述されています: 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_Quarter e_type; |
||
Elf64_Quarter e_machine; |
||
Elf64_Half e_version; |
||
Elf64_Addr e_entry; |
||
Elf64_Off e_phoff; |
||
Elf64_Off e_shoff; |
||
Elf64_Half e_flags; |
||
Elf64_Quarter e_ehsize; |
||
Elf64_Quarter e_phentsize; |
||
Elf64_Quarter e_phnum; |
||
Elf64_Quarter e_shentsize; |
||
Elf64_Quarter e_shnum; |
||
Elf64_Quarter e_shstrndx; |
} Elf64_Ehdr; フィールドは、以下の意味を持っています: |
e_ident
このバイト配列はファイルをどのように解釈すべきかを指定 します。これは、プロセッサまたはファイルの残りの内容か ら独立しています。この配列中の全要素は、 EI_ で開始す るマクロにより名付けられ、また先頭に ELF がついた値を 持ち得ます。以下のマクロが定義されています: EI_MAG0 ELFCLASSNONE ELFDATANONE EV_NONE ELFOSABI_SYSV e_type ET_NONE e_machine EM_NONE e_version EV_NONE 実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブル は、構造体の配列です。各構造体は、プログラム実行にシステムが必要とする、 セグメント等の情報を記述します。オブジェクトファイルの セグメントは、1 つ 以上の セクションを含みます。プログラムヘッダは、実行可能ファイルと共有オ ブジェクトファイルだけで意味があります。ファイルは、ELF ヘッダの e_phentsize と e_phnum メンバでそれ自身のプログラムヘッダサイズを指定しま す。 ELF 実行形式のヘッダと同様に、プログラムヘッダもアーキテクチャに従い 異なるバージョンを持ちます: typedef struct { typedef struct { Elf64_Half p_type; Elf64_Half p_flags; Elf64_Off p_offset; Elf64_Addr p_vaddr; Elf64_Addr p_paddr; Elf64_Size p_filesz; Elf64_Size p_memsz; Elf64_Size p_align; } Elf64_Phdr; 32 ビットと 64 ビットのプログラムヘッダの間の主な差は、構造体中の p_flags メンバの位置だけです。 |
p_type
構造体 Phdr のこのメンバは、この配列要素が記述しているセ グメントの種類を示し、どのように配列要素を解釈すべきかを 示します。 PT_NULL p_offset PF_X テキストセグメントは、一般にフラグ PF_X と
PF_R を持ちま す。データセグメントは、一般に
PF_X, PF_W と PF_R を持ち ます。 ファイルのセクションヘッダテーブルは、全てのファイルのセクションの位置決 定を可能とします。セクションヘッダテーブルは、Elf32_Shdr または Elf64_Shdr 構造体の配列です。 ELF ヘッダの e_shoff メンバは、セクション ヘッダテーブルの、ファイル先頭からのバイトオフセットを与えます。 e_shnum は、セクションヘッダテーブルのエントリ数を持ちます。 e_shentsize は、各エ ントリの大きさをバイトで持ちます。 セクションヘッダテーブルインデックスは、この配列の添字です。セクション ヘッダテーブルインデックスには、予約のものがあります。オブジェクトファイ ルには、次の特別なインデックスにはセクションがありません: SHN_UNDEF セクションヘッダは、以下の構造体を持ちます: typedef struct { |
Elf32_Word sh_name; |
||
Elf32_Word sh_type; |
||
Elf32_Word sh_flags; |
||
Elf32_Addr sh_addr; |
||
Elf32_Off sh_offset; |
||
Elf32_Size sh_size; |
||
Elf32_Word sh_link; |
||
Elf32_Word sh_info; |
||
Elf32_Size sh_addralign; |
||
Elf32_Size sh_entsize; |
} Elf32_Shdr; typedef struct { |
Elf64_Half sh_name; |
||
Elf64_Half sh_type; |
||
Elf64_Size sh_flags; |
||
Elf64_Addr sh_addr; |
||
Elf64_Off sh_offset; |
||
Elf64_Size sh_size; |
||
Elf64_Half sh_link; |
||
Elf64_Half sh_info; |
||
Elf64_Size sh_addralign; |
||
Elf64_Size sh_entsize; |
} Elf64_Shdr; |
sh_name
このメンバは、セクションの名前を指定します。その値は、セク
ションヘッダ文字列テーブルセクションへのインデックスであ
り、ヌル文字で終わる文字列の場所を与えます。 SHT_NULL sh_flags SHF_WRITE sh_addr 様々なセクションが、プログラムと制御情報を持ちます: 文字列テーブルセクションは、ヌル文字で終わる文字シーケンス群を持ちます。 これらは、一般に文字列と呼ばれます。オブジェクトファイルは、シンボルとセ クション名を表現するためにこれらの文字列を使います。文字列テーブルセク ションのインデックスとして、文字列を参照します。最初のバイト (インデック ス 0) は、単一のヌル文字を持つと定義されます。同様に、文字列テーブルの最 終バイトはヌル文字であると定義されので、文字列全体がナル終端されているこ とを保証します。 オブジェクトファイルのシンボルテーブルは、プログラムのシンボル定義と参照 の位置決定に必要な情報を保持します。シンボルテーブルインデックスは、この 配列の添字です。 typedef struct { |
Elf32_Word st_name; |
||
Elf32_Addr st_value; |
||
Elf32_Size st_size; |
||
unsigned char st_info; |
||
unsigned char st_other; |
||
Elf32_Half st_shndx; |
} Elf32_Sym; typedef struct { |
Elf64_Half st_name; |
||
unsigned char st_info; |
||
unsigned char st_other; |
||
Elf64_Quarter st_shndx; |
||
Elf64_Addr st_value; |
||
Elf64_Size st_size; |
} Elf64_Sym; |
st_name
このメンバは、オブジェクトファイルのシンボル文字列テーブルへの
インデックスを持ちます。シンボル文字列テーブルは、シンボル名の
文字表現を持ちます。値が 0
以外であるならば、それはシンボル名を
与える文字列テーブルインデックスを示します。そうでない場合、シ
ンボルテーブルには名前がありません。 STT_NOTYPE STB_LOCAL 束縛とタイプフィールドのパックおよびアンパック用の マクロがあります: ELF32_ST_BIND(info) st_other 再配置は、シンボル参照とシンボル定義を接続する処理です。再配置可能なファ イルは、それらのセクション内容の修正方法を記述する情報を持つ必要がありま す。このようにして、実行可能ファイルと共有オブジェクトファイルが、プロセ スのプログラムイメージのための正しい情報を持てます。再配置エントリは、こ れらのデータです。 加数を必要としない再配置構造体: typedef struct { |
Elf32_Addr r_offset; |
||
Elf32_Word r_info; |
} Elf32_Rel; typedef struct { |
Elf64_Addr r_offset; |
||
Elf64_Size r_info; |
} Elf64_Rel; 加数を必要とする再配置構造体: typedef struct { |
Elf32_Addr r_offset; |
||
Elf32_Word r_info; |
||
Elf32_Sword r_addend; |
} Elf32_Rela; typedef struct { |
Elf64_Addr r_offset; |
||
Elf64_Size r_info; |
||
Elf64_Off r_addend; |
} Elf64_Rela; |
r_offset
このメンバは、再配置動作を適用する場所を与えます。再配置可能な
ファイルでは、値は、再配置によって影響を受ける記憶単位のセク
ション先頭からのバイトオフセットです。実行可能ファイルまたは共
用オブジェクトでは、値は、再配置によって影響を受ける記憶単位の
仮想アドレスです。 関連項目 |
Hewlett Packard, Elf-64 Object File Format. Santa Cruz Operation, System V Application Binary Interface. Unix System Laboratories, " Object Files", Executable and LinkingFormat (ELF).
歴史
ELF ヘッダファイルは、 FreeBSD 2.2.6 で登場しました。 ELF 自身は、最初に AT&T System V UNIX で登場しました。 ELF フォーマットは、標準として採用さ れています。 |
作者
このマニュアルページは、BSDi の BSD/OS elf(5) のマニュアルページに触発さ れて、 Jeroen Ruigrok van der Werven 〈asmodai@FreeBSD.org〉 が書きました。 FreeBSD July 31, 1999 FreeBSD |