スポンサーリンク

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_NIDENT
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_phentsizee_phnum の積は、 テーブルのバイト単位の大きさを与えます。ファイルにプロ グラムヘッダがないならば、 e_phnum の値は 0 になりま す。
e_shentsize
このメンバは、セクションヘッダのバイト単位の大きさを持 ちます。セクションヘッダは、セクションヘッダテーブルの 中の 1 つのエントリです; 全てのエントリは、同じ大きさ です。
e_shnum
このメンバは、セクションヘッダテーブル中のエントリの個 数を持ちます。つまり、 e_shentsizee_shnum の積は、 セクションヘッダテーブルのバイト単位の大きさを与えま す。ファイルにセクションヘッダテーブルがないならば、 e_shnum の値は 0 になります。
e_shstrndx
このメンバは、セクションヘッダテーブルの、セクション名 文字列テーブルに結びつけられたエントリへのインデックス を持ちます。ファイルにセクション名文字列テーブルがない ならば、このメンバは値 SHN_UNDEF を持ちます。

実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブル は、構造体の配列です。各構造体は、プログラム実行にシステムが必要とする、 セグメント等の情報を記述します。オブジェクトファイルの セグメントは、1 つ 以上の セクションを含みます。プログラムヘッダは、実行可能ファイルと共有オ ブジェクトファイルだけで意味があります。ファイルは、ELF ヘッダの e_phentsizee_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_fileszp_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_XPF_R を持ちま す。データセグメントは、一般に PF_X, PF_WPF_R を持ち ます。
p_align
このメンバは、メモリ中およびファイル中でセグメントが整列 すべき値を持ちます。ロード可能なプロセスは、 p_vaddrp_offset をページサイズで割った余りに適合する値を持つ必要 があります。 0 と 1 の値は、境界調整が不要であることを意 味します。そうでない場合、 p_align は、正 (2 の整数乗) で ある必要があります。そして、 p_vaddrp_offsetp_align で割った余りと等しい必要があります。

ファイルのセクションヘッダテーブルは、全てのファイルのセクションの位置決 定を可能とします。セクションヘッダテーブルは、Elf32_Shdr または Elf64_Shdr 構造体の配列です。 ELF ヘッダの e_shoff メンバは、セクション ヘッダテーブルの、ファイル先頭からのバイトオフセットを与えます。 e_shnum は、セクションヘッダテーブルのエントリ数を持ちます。 e_shentsize は、各エ ントリの大きさをバイトで持ちます。

セクションヘッダテーブルインデックスは、この配列の添字です。セクション ヘッダテーブルインデックスには、予約のものがあります。オブジェクトファイ ルには、次の特別なインデックスにはセクションがありません:

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_LORESERVESHN_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_LOUSERSHT_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_ALLOCSHF_WRITE です。
.comment
このセクションは、バージョン制御情報を持ちます。このセクション は、タイプ SHT_PROGBITS です。属性タイプは使われません。
.data
このセクションは初期化されたデータを持ち、プログラムのメモリイ メージになります。このセクションは、タイプ SHT_PROGBITS です。 属性タイプは、 SHF_ALLOCSHF_WRITE です。
.data1
このセクションは初期化されたデータを持ち、プログラムのメモリイ メージになります。このセクションは、タイプ SHT_PROGBITS です。 属性タイプは、 SHF_ALLOCSHF_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_ALLOCSHF_EXECINSTR です。
.got
このセクションは、グローバルオフセットテーブルを持ちます。この セクションは、タイプ SHT_PROGBITS です。属性は、プロセッサ依存 です。
.hash
このセクションは、シンボルハッシュテーブルを持ちます。このセク ションは、タイプ SHT_HASH です。使われる属性は、 SHF_ALLOC で す。
.init
このセクションは、プロセス初期化コードの実行可能命令を持ちま す。プログラム実行開始時に、メインプログラムエントリポイントを 呼び出す前に、システムはこのセクションのコードを実行します。こ のセクションは、タイプ SHT_PROGBITS です。使われる属性は、 SHF_ALLOCSHF_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_ALLOCSHF_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 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

スポンサーリンク