日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.2-RELEASE-K, 8.0-RELEASE-K は、全翻訳済み)
6.4-STABLE-K, 7.2-STABLE-K, 8.0-STABLE-K は現在、 作成中で日々更新されています。 最新の snapshots を元に作成しています。
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 ビットアーキテクチャのために使われています:
Elf32_Addr 符号無しプログラムアドレス
Elf32_Half 符号無しハーフワードフィールド
Elf32_Off 符号無しファイルオフセット
Elf32_Sword 符号付き大整数
Elf32_Word フィールドまたは符号無し大整数
Elf32_Size 符号無しオブジェクトサイズ
64 ビットアーキテクチャ用に以下のタイプが用意されています:
Elf64_Addr 符号無しプログラムアドレス
Elf64_Half 符号無しハーフワードフィールド
Elf64_Off 符号無しファイルオフセット
Elf64_Sword 符号付き大整数
Elf64_Word フィールドまたは符号無し大整数
Elf64_Size 符号無しオブジェクトサイズ
Elf64_Quarter 符号無しクォータワードフィールド
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 マジック番号の第 1 のバイト。 ELFMAG0
であることが必要です。
EI_MAG1 マジック番号の第 2 のバイト。 ELFMAG1
であることが必要です。
EI_MAG2 マジック番号の第 3 のバイト。 ELFMAG2
であることが必要です。
EI_MAG3 マジック番号の第 4 のバイト。 ELFMAG3
であることが必要です。
EI_CLASS 第 5 のバイトは、当該のバイナリファイル
のアーキテクチャを識別します:
ELFCLASSNONE このクラスは、不当です。
ELFCLASS32 これは、32 ビットアーキテ
クチャを定義します。ファ
イル空間と仮想アドレス空
間が 4 ギガバイトまでにお
さまるマシンに対応しま
す。
ELFCLASS64 これは、64 ビットアーキテ
クチャを定義します。
EI_DATA 第 6 のバイトは、ファイルのプロセッサ固
有データのエンコーディングを指定しま
す。現在、次のエンコーディングがサポー
トされています:
ELFDATANONE 未知のデータフォーマット。
ELFDATA2LSB 2 の補数、リトルエンディア
ン。
ELFDATA2MSB 2 の補数、ビッグエンディア
ン。
EI_VERSION ELF 仕様書のバージョンナンバ:
EV_NONE 不当なバージョン。
EV_CURRENT 現在のバージョン。
EI_OSABI このバイトは、オブジェクトの対象であ
る、オペレーティングシステムと ABI を識
別します。他の ELF 構造中のフィールドに
は、プラットフォーム依存の意味のものが
あります。そのようなフィールドの解釈
は、このバイトの値で決定されます。次の
値が現在定義されています:
ELFOSABI_SYSV UNIX System V
ABI。
ELFOSABI_HPUX HP-UX オペレーティ
ングシステム ABI。
ELFOSABI_NETBSD NetBSD オペレー
ティングシステム
ABI。
ELFOSABI_LINUX GNU/Linux オペレー
ティングシステム
ABI。
ELFOSABI_HURD GNU/Hurd オペレー
ティングシステム
ABI。
ELFOSABI_86OPEN 86Open Common IA32
ABI。
ELFOSABI_SOLARIS Solaris オペレー
ティングシステム
ABI。
ELFOSABI_MONTEREY Monterey プロジェ
クト ABI。
ELFOSABI_IRIX IRIX オペレーティ
ングシステム ABI。
ELFOSABI_FREEBSD FreeBSD オペレー
ティングシステム
ABI。
ELFOSABI_TRU64 TRU64 UNIX オペ
レーティングシステ
ム ABI。
ELFOSABI_ARM ARM アーキテクチャ
ABI。
ELFOSABI_STANDALONE Standalone (組み込
み) ABI。
EI_ABIVERSION このバイトは、オブジェクトの対象である
ABI のバージョンを識別します。この
フィールドは、同じ ABI でも、互換性の無
いもの同士を区別するために使用されま
す。バージョン番号の解釈は、EI_OSABI
フィールドで識別される ABI に依存しま
す。この仕様に準拠するアプリケーション
は、値 0 を使用します。
EI_PAD パディングの始め。これらのバイトは、予
約されており、0 にセットされます。ここ
を読むプログラムは、これを無視する必要
があります。将来、現在使っていないバイ
トに意味が与えられた時には、 EI_PAD の
値は変わります。
EI_BRAND アーキテクチャ識別子の始め。
EI_NIDENTT e_ident 配列の大きさ。
e_type 構造体のこのメンバは、オブジェクトファイルタイプを識別
します:
ET_NONE 未知のタイプ。
ET_REL 再配置可能なファイル。
ET_EXEC 実行可能ファイル。
ET_DYN 共有オブジェクト。
ET_CORE コアファイル。
e_machine このメンバは、個々のファイルに必要なアーキテクチャを指
定します:
EM_NONE 未知のマシン。
EM_M32 AT&T WE 32100
EM_SPARC Sun Microsystems SPARC.
EM_386 Intel 80386.
EM_68K Motorola 68000
EM_88K Motorola 88000
EM_486 Intel 80486
EM_860 Intel 80860
EM_MIPS MIPS RS3000 (ビッグエンディアンのみ)
EM_MIPS_RS4_BE MIPS RS4000 (ビッグエンディアンのみ)
EM_SPARC64 SPARC v9 64-bit 非公式
EM_PARISC HPPA
EM_PPC PowerPC
EM_ALPHA Compaq [DEC] Alpha
e_version このメンバは、ファイルバージョンを識別します:
EV_NONE 不当なバージョン。
EV_CURRENT 現在のバージョン。
e_entry このメンバは、システムが最初に制御を移す、つまりプロセ
スを開始する仮想アドレスを示します。ファイルにエントリ
ポイントがないならば、このメンバは 0 になります。
e_phoff このメンバは、プログラムヘッダテーブルのバイト単位の
ファイルオフセットを持ちます。
e_shoff このメンバは、セクションヘッダテーブルのバイト単位の
ファイルオフセットを持ちます。ファイルにセクションヘッ
ダテーブルがないならば、このメンバは 0 になります。
e_flags このメンバは、ファイルに関連する、プロセッサに固有なフ
ラグを持ちます。フラグ名は、EF_`machine_flag' という形
式になります。現在、定義されたフラグはありません。
e_ehsize このメンバは、ELF ヘッダのバイト単位の大きさを持ちま
す。
e_phentsize このメンバは、ファイルのプログラムヘッダテーブルにある
エントリ 1 個分のサイズを持ちます。全てのエントリは、
同じ大きさです。
e_phnum このメンバは、プログラムヘッダテーブル中のエントリの個
数を持ちます。つまり、 e_phentsize と e_phnum の積は、
テーブルのバイト単位の大きさを与えます。ファイルにプロ
グラムヘッダがないならば、 e_phnum の値は 0 になりま
す。
e_shentsize このメンバは、セクションヘッダのバイト単位の大きさを持
ちます。セクションヘッダは、セクションヘッダテーブルの
中の 1 つのエントリです; 全てのエントリは、同じ大きさ
です。
e_shnum このメンバは、セクションヘッダテーブル中のエントリの個
数を持ちます。つまり、 e_shentsize と e_shnum の積は、
セクションヘッダテーブルのバイト単位の大きさを与えま
す。ファイルにセクションヘッダテーブルがないならば、
e_shnum の値は 0 になります。
e_shstrndx このメンバは、セクションヘッダテーブルの、セクション名
文字列テーブルに結びつけられたエントリへのインデックス
を持ちます。ファイルにセクション名文字列テーブルがない
ならば、このメンバは値 SHN_UNDEF を持ちます。
SHN_UNDEF この値は、未定義か、存在しないか、無関
係であるか、意味がないセクション参照を
示します。例えば、セクション番号
SHN_UNDEF からの相対で ``定義'' される
シンボルは、未定義シンボルです。
SHN_LORESERVE この値は、予約のインデックスの範囲の下
限を指定します。
SHN_LOPROC この値から SHN_HIPROC 以下は、プロセッ
サ固有のセマンティクスのために予約され
ています。
SHN_HIPROC この値から SHN_LOPROC 以上は、プロセッ
サ固有のセマンティクスのために予約され
ています。
SHN_ABS この値は、対応する参照のために絶対的な
値を指定します。例えば、 SHN_ABS からの
相対で定義されるシンボルは、絶対的な値
を持ち、再配置による影響を受けません。
SHN_COMMON このセクションからの相対で定義されるシ
ンボルは、共通シンボルであり、 Fortran
の COMMON や領域が確保されていない C の
外部変数が該当します。
SHN_HIRESERVE この値は、予約インデックス範囲の上限を
指定します。この範囲は、 SHN_LORESERVE
と SHN_HIRESERVE の間であり、両端を含み
ます。これらの値は、セクションヘッダ
テーブルを参照しません。セクションヘッ
ダテーブルは予約のインデックスのために
エントリを 含みません。
実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブル
は、構造体の配列です。各構造体は、プログラム実行にシステムが必要とする、
セグメント等の情報を記述します。オブジェクトファイルの セグメントは、1 つ
以上の セクションを含みます。プログラムヘッダは、実行可能ファイルと共有オ
ブジェクトファイルだけで意味があります。ファイルは、ELF ヘッダの
e_phentsize と e_phnum メンバでそれ自身のプログラムヘッダサイズを指定しま
す。 ELF 実行形式のヘッダと同様に、プログラムヘッダもアーキテクチャに従い
異なるバージョンを持ちます:
typedef struct {
Elf32_Word p_type;
Elf32_Off p_offset;
Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf32_Size p_filesz;
Elf32_Size p_memsz;
Elf32_Word p_flags;
Elf32_Size p_align;
} Elf32_Phdr;
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 この配列要素は使っていません。また、他のメン
バの値は未定義です。これにより、プログラム
ヘッダ中に無視されるエントリを持てます。
PT_LOAD この配列要素は、ロード可能なセグメントを指定
します。これは p_filesz と p_memsz で記述され
ます。ファイルからのバイトは、メモリセグメン
トの先頭にマップされます。セグメントのメモリ
サイズ (p_memsz) がファイルサイズ (p_filesz)
より大きいならば、 ``余分な'' バイトは、値 0
を持って、セグメントの初期化された領域に続く
ものと定義されます。ファイルサイズは、メモリ
サイズを越えてはなりません。プログラムヘッダ
テーブルの中のロード可能なセグメントエントリ
は、昇順で現れます。そして、 p_vaddr メンバで
ソートされます。
PT_DYNAMIC この配列要素は、動的リンク情報を指定します。
PT_INTERP この配列要素は、インタプリタとして起動するヌ
ル文字で終わるパス名の場所と大きさを指定しま
す。このセグメントタイプは、実行可能ファイル
のみで意味があります (本セグメントタイプは、
共有オブジェクト中にあるかもしれません)。本セ
グメントは、ファイル中で複数個存在してはなり
ません。存在する場合、全ロード可能セグメント
エントリに先行する必要があります。
PT_NOTE この配列要素は、補助情報のために場所と大きさ
を指定します。
PT_SHLIB このセグメントタイプは、予約されており、明記
されていないセマンティクスを持ちます。このタ
イプの配列要素を含むプログラムは、ABI に従い
ません。
PT_PHDR この配列要素が存在する場合、ファイル中とメモ
リイメージ中における、プログラムヘッダテーブ
ル自身の位置と大きさを指定します。本セグメン
トタイプは、ファイル中で複数個存在してはなり
ません。さらに、プログラムヘッダテーブルがプ
ログラムのメモリイメージに含まれる場合のみ、
存在が許されます。存在する場合、全ロード可能
セグメントエントリに先行する必要があります。
PT_LOPROC この値から PT_HIPROC 以下は、プロセッサ固有の
セマンティクスのために予約されています。
PT_HIPROC この値から PT_LOPROC 以上は、プロセッサ固有の
セマンティクスのために予約されています。
p_offset このメンバは、セグメントの最初のバイトへの、ファイル先頭
からのオフセットを持ちます。
p_vaddr このメンバは、セグメントの最初のバイトがメモリで存在する
仮想アドレスを持ちます。
p_paddr 物理アドレッシングのシステム上では、このメンバは、セグメ
ントの物理アドレスのために予約されています。 BSD では、本
メンバは使されず、0 である必要があります。
p_filesz このメンバは、セグメントのファイルイメージのバイト数を持
ちます。 0 であるかもしれません。
p_memsz このメンバは、セグメントのメモリイメージのバイト数を持ち
ます。 0 であるかもしれません。
p_flags このメンバは、セグメントに関したフラグを持ちます。
PF_X 実行可能セグメント。
PF_W 書き込み可能なセグメント。
PF_R 読み取り可能なセグメント。
テキストセグメントは、一般にフラグ PF_X と PF_R を持ちま
す。データセグメントは、一般に PF_X, PF_W と PF_R を持ち
ます。
p_align このメンバは、メモリ中およびファイル中でセグメントが整列
すべき値を持ちます。ロード可能なプロセスは、 p_vaddr と
p_offset をページサイズで割った余りに適合する値を持つ必要
があります。 0 と 1 の値は、境界調整が不要であることを意
味します。そうでない場合、 p_align は、正 (2 の整数乗) で
ある必要があります。そして、 p_vaddr は p_offset を
p_align で割った余りと等しい必要があります。
ファイルのセクションヘッダテーブルは、全てのファイルのセクションの位置決
定を可能とします。セクションヘッダテーブルは、Elf32_Shdr または
Elf64_Shdr 構造体の配列です。 ELF ヘッダの e_shoff メンバは、セクション
ヘッダテーブルの、ファイル先頭からのバイトオフセットを与えます。 e_shnum
は、セクションヘッダテーブルのエントリ数を持ちます。 e_shentsize は、各エ
ントリの大きさをバイトで持ちます。
セクションヘッダテーブルインデックスは、この配列の添字です。セクション
ヘッダテーブルインデックスには、予約のものがあります。オブジェクトファイ
ルには、次の特別なインデックスにはセクションがありません:
SHN_UNDEF この値は、未定義か、存在しないか、無関係であるか、意味がな
いセクション参照を示します。
SHN_LORESERVE この値は、予約のインデックスの範囲の下限を指定します。
SHN_LOPROC この値から SHN_HIPROC 以下は、プロセッサ固有のセマンティク
スのために予約されています。
SHN_HIPROC この値から SHN_LOPROC 以上は、プロセッサ固有のセマンティク
スのために予約されています。
SHN_ABS この値は、対応する参照が絶対値であることを指定します。例え
ば、セクション番号 SHN_ABS からの相対で定義されてるシンボ
ルは、絶対的な数値を持ち、再配置によって影響を受けません。
SHN_COMMON このセクションからの相対で定義されるシンボルは、共通シンボ
ルであり、 Fortran の COMMON や領域が確保されていない C の
外部変数が該当します。
SHN_HIRESERVE この値は、予約インデックス範囲の上限を指定します。この範囲
は、 SHN_LORESERVE と SHN_HIRESERVE の間であり、両端を含み
ます。セクションヘッダテーブルは、予約のインデックスのため
にエントリを含みません。
セクションヘッダは、以下の構造体を持ちます:
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 このメンバは、セクションの名前を指定します。その値は、セク
ションヘッダ文字列テーブルセクションへのインデックスであ
り、ヌル文字で終わる文字列の場所を与えます。
sh_type このメンバは、セクションの内容とセマンティクスを分類しま
す。
SHT_NULL この値は、セクションヘッダが不活性であること
を示します。関連づけられたセクションを持ちま
せん。セクションヘッダの他のメンバは、未定義
値を持ちます。
SHT_PROGBITS このセクションは、プログラムによって定義され
る情報を持ちます。フォーマットと意味は、プロ
グラムだけによってのみ決定されます。
SHT_SYMTAB このセクションは、シンボルテーブルを持ちま
す。一般的に、 SHT_SYMTAB はリンクエディット
のためのシンボルを提供します。これはまた、動
的リンクにも使用可能です。これは完全なシンボ
ルテーブルであるため、動的リンクのためには不
必要な多くのシンボルを含む場合があります。オ
ブジェクトファイルは、 SHN_DYNSYM セクション
も含むことができます。
SHT_STRTAB このセクションは、文字列テーブルを持ちます。
オブジェクトファイルは、複数の文字列テーブル
セクションを持ち得ます。
SHT_RELA このセクションは、明示的な加数を持つ、再配置
エントリを持ちます。例えば、オブジェクトファ
イルの 32 ビットクラスのタイプ Elf32_Rela が
該当します。オブジェクトは、複数の再配置セク
ションを持ち得ます。
SHT_HASH このセクションは、シンボルハッシュテーブルを
持ちます。動的リンクに関連する全オブジェクト
は、シンボルハッシュテーブルを含む必要があり
ます。オブジェクトファイルは、単一のハッシュ
テーブルのみを持ち得ます。
SHT_DYNAMIC このセクションは、動的リンクのために情報を持
ちます。オブジェクトファイルは、単一の動的セ
クションのみを持ち得ます。
SHT_NOTE このセクションは、いくばくかの方法でファイル
に印をする情報を持ちます。
SHT_NOBITS このタイプのセクションは、ファイル中の空間を
占有しませんが、 SHN_PROGBITS に似ています。
このセクションはバイトを含みませんが、
sh_offset メンバは概念上のファイルオフセット
を含みます。
SHT_REL このセクションは、明示的な加数無しの再配置オ
フセットを持ちます。例えば、オブジェクトファ
イルの 32 ビットクラスのタイプ Elf32_Rel が該
当します。オブジェクトファイルは、複数の再配
置セクションを持ち得ます。
SHT_SHLIB このセクションは、予約されており、明記されて
いないセマンティクスを持ちます。
SHT_DYNSYM このセクションは、動的リンクシンボルの最小の
セットを持ちます。オブジェクトファイルは、
SHN_SYMTAB セクションも含むことができます。
SHT_LOPROC この値から SHT_HIPROC 以下は、プロセッサ固有
のセマンティクスのために予約されています。
SHT_HIPROC この値から SHT_LOPROC 以上は、プロセッサ固有
のセマンティクスのために予約されています。
SHT_LOUSER この値は、アプリケーションプログラムのために
予約されているインデックス範囲の下限を指定し
ます。
SHT_HIUSER この値は、アプリケーションプログラムのために
予約されているインデックス範囲の上限を指定し
ます。 SHT_LOUSER と SHT_HIUSER の間のセク
ションタイプは、アプリケーションによって使用
可能であり、現在または将来のシステム定義セク
ションタイプと衝突しません。
sh_flags セクションは、雑多な属性を記述する 1 ビットフラグをサポート
します。フラグビットが sh_flags でセットされるならば、その
セクションの属性は ``オン'' になります。そうでなければ、属
性は ``オフ'' であるか、あてはまりません。未定義属性は、0
にセットされます。
SHF_WRITE セクションは、プロセス実行の間、書き込み可能
であるべきデータを含みます。
SHF_ALLOC セクションは、プロセス実行の間、メモリを占有
します。制御セクションには、オブジェクトファ
イルのメモリイメージで存在しないものがありま
す。そのようなセクションでは、この属性はオフ
です。
SHF_EXECINSTR セクションは、実行可能な機械語命令を含みま
す。
SHF_MASKPROC このマスクで含まれる全てのビットは、プロセッ
サ固有のセマンティクスのために確保されます。
sh_addr セクションがプロセスのメモリイメージに現れる場合、このメン
バは、セクションの最初のバイトが存在するアドレスを持ちま
す。そうでない場合、このメンバは 0 を含みます。
sh_offset このメンバ値は、このセクションの、ファイル先頭からのバイト
オフセットを与えます。 1 つのセクションタイプ、すなわち
SHT_NOBITS は、ファイル中の空間を占有せず、その sh_offset
メンバは、ファイル中の概念上の位置を指定します。
sh_size このメンバは、セクションのバイトでの大きさを持ちます。セク
ションタイプが SHT_NOBITS でない限り、セクションはファイル
中の sh_size バイトを占有します。タイプ SHT_NOBITS のセク
ションは 0 以外の大きさを持ち得ますが、ファイル中の空間を占
有しません。
sh_link このメンバは、セクションヘッダテーブルインデックスリンクを
持ちます。この解釈は、セクションタイプ依存です。
sh_info このメンバは、追加情報を持ちます。この解釈は、セクションタ
イプ依存です。
sh_addralign 若干のセクションには、アドレス境界の制約があります。セク
ションがダブルワードを持つならば、システムはダブルワード境
界をセクション全体に保証する必要があります。 sh_addr の値
は、 sh_addralign で割った値が 0 となることが必要です。 0
と正の 2 の羃乗だけが許されます。0 または 1 の値は、セク
ションには境界の制約がないことを意味します。
sh_entsize 若干のセクションは、固定長エントリのテーブルを持ちます。例
えばシンボルテーブルがこれに該当します。そのようなセクショ
ンのために、このメンバは、各エントリのバイトでの大きさを与
えます。セクションが固定サイズのエントリのテーブルを持たな
いならば、このメンバは 0 を含みます。
様々なセクションが、プログラムと制御情報を持ちます:
.bss このセクションは初期化されないデータを持ち、プログラムのメモリ
イメージになります。定義では、プログラム開始時にシステムがデー
タを 0 初期化します。このセクションは、タイプ SHT_NOBITS で
す。属性タイプは、 SHF_ALLOC と SHF_WRITE です。
.comment このセクションは、バージョン制御情報を持ちます。このセクション
は、タイプ SHT_PROGBITS です。属性タイプは使われません。
.data このセクションは初期化されたデータを持ち、プログラムのメモリイ
メージになります。このセクションは、タイプ SHT_PROGBITS です。
属性タイプは、 SHF_ALLOC と SHF_WRITE です。
.data1 このセクションは初期化されたデータを持ち、プログラムのメモリイ
メージになります。このセクションは、タイプ SHT_PROGBITS です。
属性タイプは、 SHF_ALLOC と SHF_WRITE です。
.debug このセクションは、シンボリックデバッギングのための情報を持ちま
す。内容は、明記されていません。このセクションは、タイプ
SHT_PROGBITS です。属性タイプは使われません。
.dynamic このセクションは、動的リンク情報を持ちます。セクションの属性
は、 SHF_ALLOC ビットを含みます。 SHF_WRITE ビットがセットされ
るか否かは、プロセッサ依存です。このセクションは、タイプ
SHT_DYNAMIC です。上の属性を見てください。
.dynstr このセクションは、動的リンクのために必要とされる文字列を持ちま
す。そして一般には、名前を表現する文字列であり、シンボルテーブ
ルエントリと結び付けられています。このセクションは、タイプ
SHT_STRTAB です。使われる属性タイプは、 SHF_ALLOC です。
.dynsym このセクションは、動的リンクシンボルテーブルを持ちます。このセ
クションは、タイプ SHT_DYNSYM です。使われる属性は、 SHF_ALLOC
です。
.fini このセクションは、プロセス終了コードの実行可能命令を持ちます。
プログラムの正常終了時に、システムはこのセクションのコードを実
行します。このセクションは、タイプ SHT_PROGBITS です。使われる
属性は、 SHF_ALLOC と SHF_EXECINSTR です。
.got このセクションは、グローバルオフセットテーブルを持ちます。この
セクションは、タイプ SHT_PROGBITS です。属性は、プロセッサ依存
です。
.hash このセクションは、シンボルハッシュテーブルを持ちます。このセク
ションは、タイプ SHT_HASH です。使われる属性は、 SHF_ALLOC で
す。
.init このセクションは、プロセス初期化コードの実行可能命令を持ちま
す。プログラム実行開始時に、メインプログラムエントリポイントを
呼び出す前に、システムはこのセクションのコードを実行します。こ
のセクションは、タイプ SHT_PROGBITS です。使われる属性は、
SHF_ALLOC と SHF_EXECINSTR です。
.interp このセクションは、プログラムインタプリタのパス名を持ちます。
ファイルがこのセクションを含むロード可能なセグメントを持つなら
ば、セクションの属性は SHF_ALLOC ビットを含みます。そうでない
場合、このビットはオフです。このセクションは、タイプ
SHT_PROGBITS です。
.line このセクションはシンボリックデバッギングのために行番号情報を持
ちます。これは、プログラムソースとマシンコードの間の関係を記述
します。内容は、明記されていません。このセクションは、タイプ
SHT_PROGBITS です。属性タイプは使われません。
.note このセクションは、下で記述される ``Note Section'' フォーマット
で、情報を持ちます。このセクションは、タイプ SHT_NOTE です。属
性タイプは使われません。
.plt このセクションは、プロシージャリンケージテーブルを持ちます。こ
のセクションは、タイプ SHT_PROGBITS です。属性はプロセッサ依存
です。
.relNAME このセクションは、下記のように再配置情報を持ちます。ファイルが
再配置を含むロード可能なセグメントを持つならば、セクションの属
性は SHF_ALLOC ビットを含みます。そうでない場合、このビットは
オフです。規約により、再配置されるセクションから ``NAME'' が与
えられます。 .text のための再配置セクションは、通常名前
.rel.text を持ちます。このセクションは、タイプ SHT_REL です。
.relaNAME このセクションは、下記のように再配置情報を持ちます。ファイルが
再配置を含むロード可能なセグメントを持つならば、セクションの属
性は SHF_ALLOC ビットを含みます。そうでない場合、このビットは
オフです。規約により、再配置されるセクションから ``NAME'' が与
えられます。 .text のための再配置セクションは、通常名前
.rela.text を持ちます。このセクションは、タイプ SHT_RELA で
す。
.rodata このセクションは読み取り専用データを持ち、典型的にはプロセスイ
メージの書き込み不可セグメントになります。このセクションは、タ
イプ SHT_PROGBITS です。使われる属性は、 SHF_ALLOC です。
.rodata1 このセクションは読み取り専用データを持ち、典型的にはプロセスイ
メージの書き込み不可セグメントになります。このセクションは、タ
イプ SHT_PROGBITS です。使われる属性は、 SHF_ALLOC です。
.shstrtab このセクションはセクション名を持ちます。このセクションは、タイ
プ SHT_STRTAB です。属性タイプは使われません。
.strtab このセクションは文字列を持ちます。一般的には名前を表示する文字
列であり、シンボルテーブルエントリと結び付けられています。ファ
イルがシンボル文字列テーブルを含むロード可能なセグメントを持つ
ならば、セクションの属性は SHF_ALLOC ビットを含みます。そうで
ない場合、このビットはオフです。このセクションは、タイプ
SHT_STRTAB です。
.symtab このセクションは、シンボルテーブルを持ちます。ファイルがシンボ
ルテーブルを含むロード可能なセグメントを持つならば、セクション
の属性は SHF_ALLOC ビットを含みます。そうでない場合、このビッ
トはオフです。このセクションは、タイプ SHT_SYMTAB です。
.text このセクションは、プログラムの ``テキスト'' 、すなわち実行可能
命令を持ちます。このセクションは、タイプ SHT_PROGBITS です。使
われる属性は、 SHF_ALLOC と SHF_EXECINSTR です。
.jcr このセクションは、登録される必要がある Java クラスの情報を持ち
ます。
.eh_frame このセクションは、C++ 例外処理に使用される情報を持ちます。
文字列テーブルセクションは、ヌル文字で終わる文字シーケンス群を持ちます。
これらは、一般に文字列と呼ばれます。オブジェクトファイルは、シンボルとセ
クション名を表現するためにこれらの文字列を使います。文字列テーブルセク
ションのインデックスとして、文字列を参照します。最初のバイト (インデック
ス 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 以外であるならば、それはシンボル名を
与える文字列テーブルインデックスを示します。そうでない場合、シ
ンボルテーブルには名前がありません。
st_value このメンバは、関連したシンボルの値を与えます。
st_size 多くのシンボルは、関連した大きさを持ちます。シンボルには大きさ
が無いか未知である場合、このメンバは 0 です。
st_info このメンバは、シンボルのタイプと束縛属性を指定します:
STT_NOTYPE シンボルのタイプは、定義されません。
STT_OBJECT シンボルは、データオブジェクトと結び付けられていま
す。
STT_FUNC シンボルは、関数または他の実行可能コードと結び付け
られています。
STT_SECTION シンボルは、セクションと結び付けられています。この
タイプのシンボルテーブルエントリは、主に再配置のた
めに存在して、通常 STB_LOCAL 束縛を持ちます。
STT_FILE 規約により、シンボルの名前は、オブジェクトファイル
と関連するソースファイルの名前を与えます。存在する
場合、ファイルシンボルは STB_LOCAL 束縛を持ち、そ
のセクションインデックスは SHN_ABS であり、それは
ファイルの他の STB_LOCAL シンボルに先行します。
STT_LOPROC この値から STT_HIPROC 以下は、プロセッサに固有のセ
マンティクスのために予約されています。
STT_HIPROC この値から STT_LOPROC 以上は、プロセッサに固有のセ
マンティクスのために予約されています。
STB_LOCAL ローカルなシンボルは、それらの定義を含んでいるオブ
ジェクトファイルの外側には、見えません。同じ名前の
ローカルなシンボルは、お互いのじゃまをすることなく
複数ファイルで存在し得ます。
STB_GLOBAL グローバルシンボルは、結合されている全てのオブジェ
クトファイルから見えます。あるファイルによるグロー
バルシンボルの定義は、別ファイルの同じシンボルの未
定義参照を満足させます。
STB_WEAK 弱いシンボルはグローバルシンボルに似ています。しか
し、彼らの定義は低い優先順位を持ちます。
STB_LOPROC この値から STB_HIPROC 以下は、プロセッサに固有のセ
マンティクスのために予約されています。
STB_HIPROC この値から STB_LOPROC 以上は、プロセッサに固有のセ
マンティクスのために予約されています。
束縛とタイプフィールドのパックおよびアンパック用の
マクロがあります:
ELF32_ST_BIND(info) または
ELF64_ST_BIND(info) は、
束縛を st_info 値から引
出します。
ELF64_ST_TYPE(info) または
ELF32_ST_TYPE(info) は、
タイプを st_info 値から
引出します。
ELF32_ST_INFO(bind, type) または
ELF64_ST_INFO(bind,
type) は、束縛とタイプを
st_info 値へ変換します。
st_other このメンバは、現在 0 を持ち、定義された意味を持ちません。
st_shndx あらゆるシンボルテーブルエントリは、なんらかのセクションに関し
て ``定義されています'' 。このメンバは、関連するセクションヘッ
ダテーブルインデックスを持ちます。
再配置は、シンボル参照とシンボル定義を接続する処理です。再配置可能なファ
イルは、それらのセクション内容の修正方法を記述する情報を持つ必要がありま
す。このようにして、実行可能ファイルと共有オブジェクトファイルが、プロセ
スのプログラムイメージのための正しい情報を持てます。再配置エントリは、こ
れらのデータです。
加数を必要としない再配置構造体:
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 このメンバは、再配置動作を適用する場所を与えます。再配置可能な
ファイルでは、値は、再配置によって影響を受ける記憶単位のセク
ション先頭からのバイトオフセットです。実行可能ファイルまたは共
用オブジェクトでは、値は、再配置によって影響を受ける記憶単位の
仮想アドレスです。
r_info このメンバは、再配置されるシンボルテーブルインデックスと、使用
する再配置のタイプを与えます。再配置タイプは、プロセッサ依存で
す。テキストが再配置エントリの再配置タイプまたはシンボルテーブ
ルインデックスを参照するとき、エントリの r_info メンバに対し、
それぞれ ELF_[32|64]_R_TYPE または ELF[32|64]_R_SYM を適用する
結果を意味しています。
r_addend このメンバは、定数の加数を指定します。これは、再配置可能な
フィールドに格納される値を計算するために使用されます。
関連項目
as(1), gdb(1), ld(1), objdump(1), execve(2), core(5)
Hewlett Packard, Elf-64 Object File Format.
Santa Cruz Operation, System V Application Binary Interface.
Unix System Laboratories, "Object Files", Executable and Linking Format
(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