diff options
Diffstat (limited to 'documentation/manual-pages/ja/man5/elf.5')
-rw-r--r-- | documentation/manual-pages/ja/man5/elf.5 | 1323 |
1 files changed, 1323 insertions, 0 deletions
diff --git a/documentation/manual-pages/ja/man5/elf.5 b/documentation/manual-pages/ja/man5/elf.5 new file mode 100644 index 0000000000..f4bc9e8168 --- /dev/null +++ b/documentation/manual-pages/ja/man5/elf.5 @@ -0,0 +1,1323 @@ +.\"Copyright (c) 1999 Jeroen Ruigrok van der Werven +.\"All rights reserved. +.\" +.\"Redistribution and use in source and binary forms, with or without +.\"modification, are permitted provided that the following conditions +.\"are met: +.\"1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\"2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\"THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\"ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\"IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\"ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\"FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\"DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\"OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\"HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\"LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\"OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\"SUCH DAMAGE. +.\" +.\" %FreeBSD: src/share/man/man5/elf.5,v 1.28 2004/07/03 18:29:22 ru Exp % +.\" +.\" $FreeBSD$ +.Dd July 31, 1999 +.Dt ELF 5 +.Os FreeBSD +.Sh 名称 +.Nm elf +.Nd ELF 実行形式バイナリファイルのフォーマット +.Sh 書式 +.In elf.h +.Sh 解説 +ヘッダファイル +.In elf.h +は、ELF 実行形式バイナリファイルのフォーマットを定義しています。 +ELF には普通の実行可能ファイル、再配置可能なオブジェクトファイル、 +コアファイル、共有ライブラリがあります。 +.Pp +ELF ファイルフォーマットを使っている +実行可能ファイルは ELF ヘッダを持ちます。 +そして、プログラムヘッダテーブルか、 +セクションヘッダテーブル、あるいはその両方が続きます。 +ELF ヘッダは、常にファイルのオフセット 0 にあります。 +プログラムヘッダテーブルと +セクションヘッダテーブルのファイル中のオフセットは、 +ELF ヘッダで定義されています。 +2 つのテーブルは、ファイルの特徴の残りの部分を記述します。 +.Pp +ネイティブアーキテクチャの ELF バイナリファイルを処理するアプリケーションは、 +そのソースコードに +.In elf.h +をインクルードするだけですみます。 +これらのアプリケーションは、総称名 +.Dq Elf_xxx +による全タイプと構造体への参照を含む必要があり、 +.Dq ELF_xxx +によるマクロへの参照を含む必要があるでしょう。 +このようにして記述されたアプリケーションは、 +どのようなアーキテクチャであっても、 +ホストが 32 ビットなのか、あるいは 64 ビットなのか +ということを気にしないで、コンパイル可能です。 +.Pp +未知のアーキテクチャの ELF ファイルを処理する必要があるアプリケーションは、 +.In elf.h +ではなく、 +.In sys/elf32.h +と +.In sys/elf64.h +の両方をインクルードする必要があります。 +さらに、全てのタイプと構造体は、 +.Dq Elf32_xxx +か +.Dq Elf64_xxx +によって区別する必要があります。 +マクロは、 +.Dq ELF32_xxx +または +.Dq ELF64_xxx +によって区別する必要があります。 +.Pp +システムのアーキテクチャがたとえ何であっても、常に +.In sys/elf_generic.h +だけでなく、 +.In sys/elf_common.h +もインクルードします。 +.Pp +これらのヘッダファイルでは、 +上で言及したヘッダを C 構造体として記述し、 +これに加えて動的セクションと +再配置セクションとシンボルテーブルのための構造体を含んでいます。 +.Pp +以下のタイプが、32 ビットアーキテクチャのために使われています: +.Bd -literal -offset indent +Elf32_Addr 符号無しプログラムアドレス +Elf32_Half 符号無しハーフワードフィールド +Elf32_Off 符号無しファイルオフセット +Elf32_Sword 符号付き大整数 +Elf32_Word フィールドまたは符号無し大整数 +Elf32_Size 符号無しオブジェクトサイズ +.Ed +.Pp +64 ビットアーキテクチャ用に以下のタイプが用意されています: +.Bd -literal -offset indent +Elf64_Addr 符号無しプログラムアドレス +Elf64_Half 符号無しハーフワードフィールド +Elf64_Off 符号無しファイルオフセット +Elf64_Sword 符号付き大整数 +Elf64_Word フィールドまたは符号無し大整数 +Elf64_Size 符号無しオブジェクトサイズ +Elf64_Quarter 符号無しクォータワードフィールド +.Ed +.Pp +ELF ファイルフォーマットが定義する全てのデータ構造は、 +関連するクラスのために +.Dq 自然な +サイズと境界調整のガイドラインに従っています。 +必要ならば、データ構造は、4 バイトオブジェクトが +4 バイト境界となることを保証するために、 +構造体のサイズを強制的に 4 の倍数にするとかいった手段で、 +明示的なパディングを含めます。 +.Pp +ELF ヘッダは、Elf32_Ehdr 型または Elf64_Ehdr 型によって記述されています: +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +フィールドは、以下の意味を持っています: +.Pp +.Bl -tag -width "e_phentsize" -compact -offset indent +.It Dv e_ident +このバイト配列はファイルをどのように解釈すべきかを指定します。 +これは、プロセッサまたはファイルの残りの内容から独立しています。 +この配列中の全要素は、 +.Sy EI_ +で開始するマクロにより名付けられ、また先頭に +.Sy ELF +がついた値を持ち得ます。 +以下のマクロが定義されています: +.Pp +.Bl -tag -width "EI_ABIVERSION" -compact +.It Dv EI_MAG0 +マジック番号の第 1 のバイト。 +.Sy ELFMAG0 +であることが必要です。 +.It Dv EI_MAG1 +マジック番号の第 2 のバイト。 +.Sy ELFMAG1 +であることが必要です。 +.It Dv EI_MAG2 +マジック番号の第 3 のバイト。 +.Sy ELFMAG2 +であることが必要です。 +.It Dv EI_MAG3 +マジック番号の第 4 のバイト。 +.Sy ELFMAG3 +であることが必要です。 +.It Dv EI_CLASS +第 5 のバイトは、当該のバイナリファイルのアーキテクチャを識別します: +.Pp +.Bl -tag -width "ELFCLASSNONE" -compact +.It Dv ELFCLASSNONE +このクラスは、不当です。 +.It Dv ELFCLASS32 +これは、32 ビットアーキテクチャを定義します。 +ファイル空間と仮想アドレス空間が 4 ギガバイトまでにおさまる +マシンに対応します。 +.It Dv ELFCLASS64 +これは、64 ビットアーキテクチャを定義します。 +.El +.It Dv EI_DATA +第 6 のバイトは、 +ファイルのプロセッサ固有データのエンコーディングを指定します。 +現在、次のエンコーディングがサポートされています: +.Pp +.Bl -tag -width "ELFDATA2LSB" -compact +.It Dv ELFDATANONE +未知のデータフォーマット。 +.It Dv ELFDATA2LSB +2 の補数、リトルエンディアン。 +.It Dv ELFDATA2MSB +2 の補数、ビッグエンディアン。 +.El +.It Dv EI_VERSION +ELF 仕様書のバージョンナンバ: +.Pp +.Bl -tag -width "EV_CURRENT" -compact +.It Dv EV_NONE +不当なバージョン。 +.It Dv EV_CURRENT +現在のバージョン。 +.El +.It Dv EI_OSABI +このバイトは、オブジェクトの対象である、 +オペレーティングシステムと ABI を識別します。 +他の ELF 構造中のフィールドには、 +プラットフォーム依存の意味のものがあります。 +そのようなフィールドの解釈は、このバイトの値で決定されます。 +次の値が現在定義されています: +.Pp +.Bl -tag -width "ELFOSABI_STANDALONE" -compact +.It Dv ELFOSABI_SYSV +UNIX System V ABI。 +.It Dv ELFOSABI_HPUX +HP-UX オペレーティングシステム ABI。 +.It Dv ELFOSABI_NETBSD +.Nx +オペレーティングシステム ABI。 +.It Dv ELFOSABI_LINUX +GNU/Linux オペレーティングシステム ABI。 +.It Dv ELFOSABI_HURD +GNU/Hurd オペレーティングシステム ABI。 +.It Dv ELFOSABI_86OPEN +86Open Common IA32 ABI。 +.It Dv ELFOSABI_SOLARIS +Solaris オペレーティングシステム ABI。 +.It Dv ELFOSABI_MONTEREY +Monterey プロジェクト ABI。 +.It Dv ELFOSABI_IRIX +IRIX オペレーティングシステム ABI。 +.It Dv ELFOSABI_FREEBSD +.Fx +オペレーティングシステム ABI。 +.It Dv ELFOSABI_TRU64 +TRU64 UNIX オペレーティングシステム ABI。 +.It Dv ELFOSABI_ARM +ARM アーキテクチャ ABI。 +.It Dv ELFOSABI_STANDALONE +Standalone (組み込み) ABI。 +.El +.It Dv EI_ABIVERSION +このバイトは、オブジェクトの対象である ABI のバージョンを識別します。 +このフィールドは、同じ ABI でも、 +互換性の無いもの同士を区別するために使用されます。 +バージョン番号の解釈は、EI_OSABI フィールドで識別される ABI に依存します。 +この仕様に準拠するアプリケーションは、値 0 を使用します。 +.It Dv EI_PAD +パディングの始め。 +これらのバイトは、予約されており、0 にセットされます。 +ここを読むプログラムは、これを無視する必要があります。 +将来、現在使っていないバイトに意味が与えられた時には、 +EI_PAD の値は変わります。 +.It Dv EI_BRAND +アーキテクチャ識別子の始め。 +.It Dv EI_NIDENT +e_ident 配列の大きさ。 +.El +.Pp +.It Dv e_type +構造体のこのメンバは、オブジェクトファイルタイプを識別します: +.Pp +.Bl -tag -width "ET_NONE" -compact +.It Dv ET_NONE +未知のタイプ。 +.It Dv ET_REL +再配置可能なファイル。 +.It Dv ET_EXEC +実行可能ファイル。 +.It Dv ET_DYN +共有オブジェクト。 +.It Dv ET_CORE +コアファイル。 +.El +.Pp +.It Dv e_machine +このメンバは、個々のファイルに必要なアーキテクチャを指定します: +.Pp +.Bl -tag -width "EM_MIPS_RS4_BE" -compact +.It Dv EM_NONE +未知のマシン。 +.It Dv EM_M32 +AT&T WE 32100 +.It Dv EM_SPARC +Sun Microsystems SPARC. +.It Dv EM_386 +Intel 80386. +.It Dv EM_68K +Motorola 68000 +.It Dv EM_88K +Motorola 88000 +.It Dv EM_486 +Intel 80486 +.It Dv EM_860 +Intel 80860 +.It Dv EM_MIPS +MIPS RS3000 (ビッグエンディアンのみ) +.It Dv EM_MIPS_RS4_BE +MIPS RS4000 (ビッグエンディアンのみ) +.It Dv EM_SPARC64 +SPARC v9 64-bit 非公式 +.It Dv EM_PARISC +HPPA +.It Dv EM_PPC +PowerPC +.It Dv EM_ALPHA +Compaq [DEC] Alpha +.El +.Pp +.It Dv e_version +このメンバは、ファイルバージョンを識別します: +.Pp +.Bl -tag -width "EV_CURRENT" -compact +.It Dv EV_NONE +不当なバージョン。 +.It Dv EV_CURRENT +現在のバージョン。 +.El +.It Dv e_entry +このメンバは、システムが最初に制御を移す、 +つまりプロセスを開始する仮想アドレスを示します。 +ファイルにエントリポイントがないならば、このメンバは 0 になります。 +.It Dv e_phoff +このメンバは、 +プログラムヘッダテーブルのバイト単位のファイルオフセットを持ちます。 +.It Dv e_shoff +このメンバは、 +セクションヘッダテーブルのバイト単位のファイルオフセットを持ちます。 +ファイルにセクションヘッダテーブルがないならば、このメンバは 0 になります。 +.It Dv e_flags +このメンバは、ファイルに関連する、プロセッサに固有なフラグを持ちます。 +フラグ名は、EF_`machine_flag' という形式になります。 +現在、定義されたフラグはありません。 +.It Dv e_ehsize +このメンバは、ELF ヘッダのバイト単位の大きさを持ちます。 +.It Dv e_phentsize +このメンバは、 +ファイルのプログラムヘッダテーブルにあるエントリ 1 個分のサイズを持ちます。 +全てのエントリは、同じ大きさです。 +.It Dv e_phnum +このメンバは、プログラムヘッダテーブル中のエントリの個数を持ちます。 +つまり、 +.Sy e_phentsize +と +.Sy e_phnum +の積は、テーブルのバイト単位の大きさを与えます。 +ファイルにプログラムヘッダがないならば、 +.Sy e_phnum +の値は 0 になります。 +.It Dv e_shentsize +このメンバは、セクションヘッダのバイト単位の大きさを持ちます。 +セクションヘッダは、 +セクションヘッダテーブルの中の 1 つのエントリです; +全てのエントリは、同じ大きさです。 +.It Dv e_shnum +このメンバは、セクションヘッダテーブル中のエントリの個数を持ちます。 +つまり、 +.Sy e_shentsize +と +.Sy e_shnum +の積は、セクションヘッダテーブルのバイト単位の大きさを与えます。 +ファイルにセクションヘッダテーブルがないならば、 +.Sy e_shnum +の値は 0 になります。 +.It Dv e_shstrndx +このメンバは、 +セクションヘッダテーブルの、 +セクション名文字列テーブルに結びつけられたエントリへの +インデックスを持ちます。 +ファイルにセクション名文字列テーブルがないならば、 +このメンバは値 +.Sy SHN_UNDEF +を持ちます。 +.El +.Pp +実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブルは、 +構造体の配列です。 +各構造体は、 +プログラム実行にシステムが必要とする、セグメント等の情報を記述します。 +オブジェクトファイルの +.Em セグメント +は、1 つ以上の +.Em セクション +を含みます。 +プログラムヘッダは、 +実行可能ファイルと共有オブジェクトファイルだけで意味があります。 +ファイルは、ELF ヘッダの +.Sy e_phentsize +と +.Sy e_phnum +メンバでそれ自身のプログラムヘッダサイズを指定します。 +ELF 実行形式のヘッダと同様に、 +プログラムヘッダもアーキテクチャに従い異なるバージョンを持ちます: +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +32 ビットと 64 ビットのプログラムヘッダの間の主な差は、 +構造体中の +.Sy p_flags +メンバの位置だけです。 +.Pp +.Bl -tag -width "p_offset" -compact -offset indent +.It Dv p_type +構造体 Phdr のこのメンバは、この配列要素が記述しているセグメントの種類を示し、 +どのように配列要素を解釈すべきかを示します。 +.Bl -tag -width "PT_DYNAMIC" -compact +.Pp +.It Dv PT_NULL +この配列要素は使っていません。また、他のメンバの値は未定義です。 +これにより、プログラムヘッダ中に無視されるエントリを持てます。 +.It Dv PT_LOAD +この配列要素は、ロード可能なセグメントを指定します。 +これは +.Sy p_filesz +と +.Sy p_memsz +で記述されます。 +ファイルからのバイトは、メモリセグメントの先頭にマップされます。 +セグメントのメモリサイズ +.Pq Sy p_memsz +がファイルサイズ +.Pq Sy p_filesz +より大きいならば、 +.Dq 余分な +バイトは、値 0 を持って、 +セグメントの初期化された領域に続くものと定義されます。 +ファイルサイズは、メモリサイズを越えてはなりません。 +プログラムヘッダテーブルの中のロード可能な +セグメントエントリは、昇順で現れます。 +そして、 +.Sy p_vaddr +メンバでソートされます。 +.It Dv PT_DYNAMIC +この配列要素は、動的リンク情報を指定します。 +.It Dv PT_INTERP +この配列要素は、 +インタプリタとして起動するヌル文字で終わるパス名の場所と大きさを指定します。 +このセグメントタイプは、実行可能ファイルのみで意味があります +(本セグメントタイプは、共有オブジェクト中にあるかもしれません)。 +本セグメントは、ファイル中で複数個存在してはなりません。 +存在する場合、 +全ロード可能セグメントエントリに先行する必要があります。 +.It Dv PT_NOTE +この配列要素は、補助情報のために場所と大きさを指定します。 +.It Dv PT_SHLIB +このセグメントタイプは、 +予約されており、明記されていないセマンティクスを持ちます。 +このタイプの配列要素を含むプログラムは、ABI に従いません。 +.It Dv PT_PHDR +この配列要素が存在する場合、 +ファイル中とメモリイメージ中における、 +プログラムヘッダテーブル自身の位置と大きさを指定します。 +本セグメントタイプは、ファイル中で複数個存在してはなりません。 +さらに、 +プログラムヘッダテーブルがプログラムのメモリイメージに含まれる場合のみ、 +存在が許されます。 +存在する場合、 +全ロード可能セグメントエントリに先行する必要があります。 +.It Dv PT_LOPROC +この値から +.Sy PT_HIPROC +以下は、プロセッサ固有のセマンティクスのために予約されています。 +.It Dv PT_HIPROC +この値から +.Sy PT_LOPROC +以上は、プロセッサ固有のセマンティクスのために予約されています。 +.El +.Pp +.It Dv p_offset +このメンバは、セグメントの最初のバイトへの、 +ファイル先頭からのオフセットを持ちます。 +.It Dv p_vaddr +このメンバは、 +セグメントの最初のバイトがメモリで存在する仮想アドレスを持ちます。 +.It Dv p_paddr +物理アドレッシングのシステム上では、 +このメンバは、セグメントの物理アドレスのために予約されています。 +.Bx +では、本メンバは使されず、0 である必要があります。 +.It Dv p_filesz +このメンバは、セグメントのファイルイメージのバイト数を持ちます。 +0 であるかもしれません。 +.It Dv p_memsz +このメンバは、セグメントのメモリイメージのバイト数を持ちます。 +0 であるかもしれません。 +.It Dv p_flags +このメンバは、セグメントに関したフラグを持ちます。 +.Pp +.Bl -tag -width "PF_X" -compact +.It Dv PF_X +実行可能セグメント。 +.It Dv PF_W +書き込み可能なセグメント。 +.It Dv PF_R +読み取り可能なセグメント。 +.El +.Pp +テキストセグメントは、一般にフラグ +.Sy PF_X +と +.Sy PF_R +を持ちます。 +データセグメントは、一般に +.Sy PF_X , +.Sy PF_W +と +.Sy PF_R +を持ちます。 +.It Dv p_align +このメンバは、メモリ中およびファイル中でセグメントが整列すべき値を持ちます。 +ロード可能なプロセスは、 +.Sy p_vaddr +と +.Sy p_offset +をページサイズで割った余りに適合する値を持つ必要があります。 +0 と 1 の値は、境界調整が不要であることを意味します。 +そうでない場合、 +.Sy p_align +は、正 (2 の整数乗) である必要があります。そして、 +.Sy p_vaddr +は +.Sy p_offset +を +.Sy p_align +で割った余りと等しい必要があります。 +.El +.Pp +ファイルのセクションヘッダテーブルは、 +全てのファイルのセクションの位置決定を可能とします。 +セクションヘッダテーブルは、Elf32_Shdr または Elf64_Shdr 構造体の配列です。 +ELF ヘッダの +.Sy e_shoff +メンバは、 +セクションヘッダテーブルの、ファイル先頭からのバイトオフセットを与えます。 +.Sy e_shnum +は、セクションヘッダテーブルのエントリ数を持ちます。 +.Sy e_shentsize +は、各エントリの大きさをバイトで持ちます。 +.Pp +セクションヘッダテーブルインデックスは、この配列の添字です。 +セクションヘッダテーブルインデックスには、予約のものがあります。 +オブジェクトファイルには、次の特別なインデックスにはセクションがありません: +.Pp +.Bl -tag -width "SHN_LORESERVE" -compact +.It Dv SHN_UNDEF +この値は、未定義か、存在しないか、無関係であるか、 +意味がないセクション参照を示します。 +例えば、セクション番号 +.Sy SHN_UNDEF +からの相対で +.Dq 定義 +されるシンボルは、未定義のシンボルです。 +.It Dv SHN_LORESERVE +この値は、予約のインデックスの範囲の下限を指定します。 +.It Dv SHN_LOPROC +この値から +.Sy SHN_HIPROC +以下は、プロセッサ固有のセマンティクスのために予約されています。 +.It Dv SHN_HIPROC +この値から +.Sy SHN_LOPROC +以上は、プロセッサ固有のセマンティクスのために予約されています。 +.It Dv SHN_ABS +この値は、対応する参照が絶対値であることを指定します。 +例えば、セクション番号 +.Sy SHN_ABS +からの相対で定義されるシンボルは、絶対的な数値を持ち、 +再配置によって影響を受けません。 +.It Dv SHN_COMMON +このセクションからの相対で定義されるシンボルは、共通シンボルであり、 +Fortran の COMMON や領域が確保されていない C の外部変数が該当します。 +.It Dv SHN_HIRESERVE +この値は、予約インデックス範囲の上限を指定します。 +この範囲は、 +.Sy SHN_LORESERVE +と +.Sy SHN_HIRESERVE +の間であり、両端を含みます。 +セクションヘッダテーブルは、予約のインデックスのためにエントリを含みません。 +.El +.Pp +セクションヘッダは、以下の構造体を持ちます: +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bl -tag -width "sh_addralign" -compact +.It Dv sh_name +このメンバは、セクションの名前を指定します。 +その値は、セクションヘッダ文字列テーブルセクションへの +インデックスであり、ヌル文字で終わる文字列の場所を与えます。 +.It Dv sh_type +このメンバは、セクションの内容とセマンティクスを分類します。 +.Pp +.Bl -tag -width "SHT_PROGBITS" -compact +.It Dv SHT_NULL +この値は、セクションヘッダが不活性であることを示します。 +関連づけられたセクションを持ちません。 +セクションヘッダの他のメンバは、未定義値を持ちます。 +.It Dv SHT_PROGBITS +このセクションは、プログラムによって定義される情報を持ちます。 +フォーマットと意味は、プログラムだけによってのみ決定されます。 +.It Dv SHT_SYMTAB +このセクションは、シンボルテーブルを持ちます。 +一般的に、 +.Sy SHT_SYMTAB +はリンクエディットのためのシンボルを提供します。 +これはまた、動的リンクにも使用可能です。 +これは完全なシンボルテーブルであるため、 +動的リンクのためには不必要な多くのシンボルを含む場合があります。 +オブジェクトファイルは、 +.Sy SHN_DYNSYM +セクションも含むことができます。 +.It Dv SHT_STRTAB +このセクションは、文字列テーブルを持ちます。 +オブジェクトファイルは、複数の文字列テーブルセクションを持ち得ます。 +.It Dv SHT_RELA +このセクションは、明示的な加数を持つ、再配置エントリを持ちます。 +例えば、オブジェクトファイルの 32 ビットクラスのタイプ +.Sy Elf32_Rela +が該当します。 +オブジェクトは、複数の再配置セクションを持ち得ます。 +.It Dv SHT_HASH +このセクションは、シンボルハッシュテーブルを持ちます。 +動的リンクに関連する全オブジェクトは、 +シンボルハッシュテーブルを含む必要があります。 +オブジェクトファイルは、単一のハッシュテーブルのみを持ち得ます。 +.It Dv SHT_DYNAMIC +このセクションは、動的リンクのために情報を持ちます。 +オブジェクトファイルは、単一の動的セクションのみを持ち得ます。 +.It Dv SHT_NOTE +このセクションは、いくばくかの方法でファイルに印をする情報を持ちます。 +.It Dv SHT_NOBITS +このタイプのセクションは、ファイル中の空間を占有しませんが、 +.Sy SHN_PROGBITS +に似ています。 +このセクションはバイトを含みませんが、 +.Sy sh_offset +メンバは概念上のファイルオフセットを含みます。 +.It Dv SHT_REL +このセクションは、明示的な加数無しの再配置オフセットを持ちます。 +例えば、オブジェクトファイルの 32 ビットクラスのタイプ +.Sy Elf32_Rel +が該当します。 +オブジェクトファイルは、複数の再配置セクションを持ち得ます。 +.It Dv SHT_SHLIB +このセクションは、予約されており、明記されていないセマンティクスを持ちます。 +.It Dv SHT_DYNSYM +このセクションは、動的リンクシンボルの最小のセットを持ちます。 +オブジェクトファイルは、 +.Sy SHN_SYMTAB +セクションも含むことができます。 +.It Dv SHT_LOPROC +この値から +.Sy SHT_HIPROC +以下は、プロセッサ固有のセマンティクスのために予約されています。 +.It Dv SHT_HIPROC +この値から +.Sy SHT_LOPROC +以上は、プロセッサ固有のセマンティクスのために予約されています。 +.It Dv SHT_LOUSER +この値は、アプリケーションプログラムのために予約されている +インデックス範囲の下限を指定します。 +.It Dv SHT_HIUSER +この値は、アプリケーションプログラムのために予約されている +インデックス範囲の上限を指定します。 +.Sy SHT_LOUSER +と +.Sy SHT_HIUSER +の間のセクションタイプは、 +アプリケーションによって使用可能であり、 +現在または将来のシステム定義セクションタイプと衝突しません。 +.El +.Pp +.It Dv sh_flags +セクションは、雑多な属性を記述する 1 ビットフラグをサポートします。 +フラグビットが +.Sy sh_flags +でセットされるならば、そのセクションの属性は +.Dq オン +になります。 +そうでなければ、属性は +.Dq オフ +であるか、あてはまりません。 +未定義属性は、0 にセットされます。 +.Pp +.Bl -tag -width "SHF_EXECINSTR" -compact +.It Dv SHF_WRITE +セクションは、プロセス実行の間、書き込み可能であるべきデータを含みます。 +.It Dv SHF_ALLOC +セクションは、プロセス実行の間、メモリを占有します。 +制御セクションには、 +オブジェクトファイルのメモリイメージで存在しないものがあります。 +そのようなセクションでは、この属性はオフです。 +.It Dv SHF_EXECINSTR +セクションは、実行可能な機械語命令を含みます。 +.It Dv SHF_MASKPROC +このマスクで含まれる全てのビットは、 +プロセッサ固有のセマンティクスのために確保されます。 +.El +.Pp +.It Dv sh_addr +セクションがプロセスのメモリイメージに現れる場合、 +このメンバは、セクションの最初のバイトが存在するアドレスを持ちます。 +そうでない場合、このメンバは 0 を含みます。 +.It Dv sh_offset +このメンバ値は、 +このセクションの、ファイル先頭からのバイトオフセットを与えます。 +1 つのセクションタイプ、すなわち +.Sy SHT_NOBITS +は、ファイル中の空間を占有せず、 +その +.Sy sh_offset +メンバは、ファイル中の概念上の位置を指定します。 +.It Dv sh_size +このメンバは、セクションのバイトでの大きさを持ちます。 +セクションタイプが +.Sy SHT_NOBITS +でない限り、セクションはファイル中の +.Sy sh_size +バイトを占有します。 +タイプ +.Sy SHT_NOBITS +のセクションは 0 以外の大きさを持ち得ますが、 +ファイル中の空間を占有しません。 +.It Dv sh_link +このメンバは、 +セクションヘッダテーブルインデックスリンクを持ちます。 +この解釈は、セクションタイプ依存です。 +.It Dv sh_info +このメンバは、 +追加情報を持ちます。 +この解釈は、セクションタイプ依存です。 +.It Dv sh_addralign +若干のセクションには、アドレス境界の制約があります。 +セクションがダブルワードを持つならば、 +システムはダブルワード境界を +セクション全体に保証する必要があります。 +.Sy sh_addr +の値は、 +.Sy sh_addralign +で割った値が 0 となることが必要です。 +'\" ここよくわからん。 +0 と正の 2 の羃乗だけが許されます。0 または 1 の値は、 +セクションには境界の制約がないことを意味します。 +.It Dv sh_entsize +若干のセクションは、 +固定長エントリのテーブルを持ちます。 +例えばシンボルテーブルがこれに該当します。 +そのようなセクションのために、 +このメンバは、各エントリのバイトでの大きさを与えます。 +セクションが固定サイズのエントリのテーブルを持たないならば、 +このメンバは 0 を含みます。 +.El +.Pp +様々なセクションが、プログラムと制御情報を持ちます: +.Bl -tag -width ".shstrtab" -compact +.It .bss +このセクションは初期化されないデータを持ち、 +プログラムのメモリイメージになります。 +定義では、 +プログラム開始時にシステムがデータを 0 初期化します。 +このセクションは、タイプ +.Sy SHT_NOBITS +です。 +属性タイプは、 +.Sy SHF_ALLOC +と +.Sy SHF_WRITE +です。 +.It .comment +このセクションは、バージョン制御情報を持ちます。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性タイプは使われません。 +.It .data +このセクションは初期化されたデータを持ち、 +プログラムのメモリイメージになります。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性タイプは、 +.Sy SHF_ALLOC +と +.Sy SHF_WRITE +です。 +.It .data1 +このセクションは初期化されたデータを持ち、 +プログラムのメモリイメージになります。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性タイプは、 +.Sy SHF_ALLOC +と +.Sy SHF_WRITE +です。 +.It .debug +このセクションは、シンボリックデバッギングのための情報を持ちます。 +内容は、明記されていません。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性タイプは使われません。 +.It .dynamic +このセクションは、動的リンク情報を持ちます。 +セクションの属性は、 +.Sy SHF_ALLOC +ビットを含みます。 +.Sy SHF_WRITE +ビットがセットされるか否かは、プロセッサ依存です。 +このセクションは、タイプ +.Sy SHT_DYNAMIC +です。 +上の属性を見てください。 +.It .dynstr +このセクションは、動的リンクのために必要とされる文字列を持ちます。 +そして一般には、名前を表現する文字列であり、 +シンボルテーブルエントリと結び付けられています。 +このセクションは、タイプ +.Sy SHT_STRTAB +です。 +使われる属性タイプは、 +.Sy SHF_ALLOC +です。 +.It .dynsym +このセクションは、動的リンクシンボルテーブルを持ちます。 +このセクションは、タイプ +.Sy SHT_DYNSYM +です。 +使われる属性は、 +.Sy SHF_ALLOC +です。 +.It .fini +このセクションは、プロセス終了コードの実行可能命令を持ちます。 +プログラムの正常終了時に、 +システムはこのセクションのコードを実行します。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +使われる属性は、 +.Sy SHF_ALLOC +と +.Sy SHF_EXECINSTR +です。 +.It .got +このセクションは、グローバルオフセットテーブルを持ちます。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性は、プロセッサ依存です。 +.It .hash +このセクションは、シンボルハッシュテーブルを持ちます。 +このセクションは、タイプ +.Sy SHT_HASH +です。 +使われる属性は、 +.Sy SHF_ALLOC +です。 +.It .init +このセクションは、プロセス初期化コードの実行可能命令を持ちます。 +プログラム実行開始時に、 +メインプログラムエントリポイントを呼び出す前に、 +システムはこのセクションのコードを実行します。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +使われる属性は、 +.Sy SHF_ALLOC +と +.Sy SHF_EXECINSTR +です。 +.It .interp +このセクションは、プログラムインタプリタのパス名を持ちます。 +ファイルがこのセクションを含むロード可能なセグメントを持つならば、 +セクションの属性は +.Sy SHF_ALLOC +ビットを含みます。 +そうでない場合、このビットはオフです。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +.It .line +このセクションはシンボリックデバッギングのために行番号情報を持ちます。 +これは、プログラムソースとマシンコードの間の関係を記述します。 +内容は、明記されていません。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性タイプは使われません。 +.It .note +このセクションは、下で記述される +.Dq Note Section +フォーマットで、情報を持ちます。 +このセクションは、タイプ +.Sy SHT_NOTE +です。 +属性タイプは使われません。 +.It .plt +このセクションは、プロシージャリンケージテーブルを持ちます。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +属性はプロセッサ依存です。 +.It .relNAME +このセクションは、下記のように再配置情報を持ちます。 +ファイルが再配置を含むロード可能なセグメントを持つならば、 +セクションの属性は +.Sy SHF_ALLOC +ビットを含みます。 +そうでない場合、このビットはオフです。 +規約により、再配置されるセクションから +.Dq NAME +が与えられます。 +.Sy .text +のための再配置セクションは、通常名前 +.Sy .rel.text +を持ちます。 +このセクションは、タイプ +.Sy SHT_REL +です。 +.It .relaNAME +このセクションは、下記のように再配置情報を持ちます。 +ファイルが再配置を含むロード可能なセグメントを持つならば、 +セクションの属性は +.Sy SHF_ALLOC +ビットを含みます。 +そうでない場合、このビットはオフです。 +規約により、再配置されるセクションから +.Dq NAME +が与えられます。 +.Sy .text +のための再配置セクションは、通常名前 +.Sy .rela.text +を持ちます。 +このセクションは、タイプ +.Sy SHT_RELA +です。 +.It .rodata +このセクションは読み取り専用データを持ち、 +典型的にはプロセスイメージの書き込み不可セグメントになります。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +使われる属性は、 +.Sy SHF_ALLOC +です。 +.It .rodata1 +このセクションは読み取り専用データを持ち、 +典型的にはプロセスイメージの書き込み不可セグメントになります。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +使われる属性は、 +.Sy SHF_ALLOC +です。 +.It .shstrtab +このセクションはセクション名を持ちます。 +このセクションは、タイプ +.Sy SHT_STRTAB +です。 +属性タイプは使われません。 +.It .strtab +このセクションは文字列を持ちます。 +一般的には名前を表示する文字列であり、 +シンボルテーブルエントリと結び付けられています。 +ファイルがシンボル文字列テーブルを含むロード可能なセグメントを持つならば、 +セクションの属性は +.Sy SHF_ALLOC +ビットを含みます。 +そうでない場合、このビットはオフです。 +このセクションは、タイプ +.Sy SHT_STRTAB +です。 +.It .symtab +このセクションは、シンボルテーブルを持ちます。 +ファイルがシンボルテーブルを含むロード可能なセグメントを持つならば、 +セクションの属性は +.Sy SHF_ALLOC +ビットを含みます。 +そうでない場合、このビットはオフです。 +このセクションは、タイプ +.Sy SHT_SYMTAB +です。 +.It .text +このセクションは、プログラムの +.Dq テキスト +、すなわち実行可能命令を持ちます。 +このセクションは、タイプ +.Sy SHT_PROGBITS +です。 +使われる属性は、 +.Sy SHF_ALLOC +と +.Sy SHF_EXECINSTR +です。 +.It .jcr +このセクションは、登録される必要がある Java クラスの情報を持ちます。 +.It .eh_frame +このセクションは、C++ 例外処理に使用される情報を持ちます。 +.El +.Pp +文字列テーブルセクションは、ヌル文字で終わる文字シーケンス群を持ちます。 +これらは、一般に文字列と呼ばれます。 +オブジェクトファイルは、 +シンボルとセクション名を表現するためにこれらの文字列を使います。 +文字列テーブルセクションのインデックスとして、文字列を参照します。 +最初のバイト (インデックス 0) は、 +単一のヌル文字を持つと定義されます。 +同様に、文字列テーブルの最終バイトはヌル文字であると定義されので、 +文字列全体がナル終端されていることを保証します。 +.Pp +オブジェクトファイルのシンボルテーブルは、 +プログラムのシンボル定義と参照の位置決定に必要な情報を保持します。 +シンボルテーブルインデックスは、この配列の添字です。 +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bd -literal -offset indent +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; +.Ed +.Pp +.Bl -tag -width "st_value" -compact +.It Dv st_name +このメンバは、オブジェクトファイルの +シンボル文字列テーブルへのインデックスを持ちます。 +シンボル文字列テーブルは、シンボル名の文字表現を持ちます。 +値が 0 以外であるならば、 +それはシンボル名を与える文字列テーブルインデックスを示します。 +そうでない場合、シンボルテーブルには名前がありません。 +.It Dv st_value +このメンバは、関連したシンボルの値を与えます。 +.It Dv st_size +多くのシンボルは、関連した大きさを持ちます。 +シンボルには大きさが無いか未知である場合、このメンバは 0 です。 +.It Dv st_info +このメンバは、シンボルのタイプと束縛属性を指定します: +.Pp +.Bl -tag -width "STT_SECTION" -compact +.It Dv STT_NOTYPE +シンボルのタイプは、定義されません。 +.It Dv STT_OBJECT +シンボルは、データオブジェクトと結び付けられています。 +.It Dv STT_FUNC +シンボルは、関数または他の実行可能コードと結び付けられています。 +.It Dv STT_SECTION +シンボルは、セクションと結び付けられています。 +このタイプのシンボルテーブルエントリは、 +主に再配置のために存在して、通常 +.Sy STB_LOCAL +束縛を持ちます。 +.It Dv STT_FILE +規約により、シンボルの名前は、 +オブジェクトファイルと関連するソースファイルの名前を与えます。 +存在する場合、ファイルシンボルは +.Sy STB_LOCAL +束縛を持ち、そのセクションインデックスは +.Sy SHN_ABS +であり、 +それはファイルの他の +.Sy STB_LOCAL +シンボルに先行します。 +.It Dv STT_LOPROC +この値から +.Sy STT_HIPROC +以下は、プロセッサに固有のセマンティクスのために予約されています。 +.It Dv STT_HIPROC +この値から +.Sy STT_LOPROC +以上は、プロセッサに固有のセマンティクスのために予約されています。 +.El +.Pp +.Bl -tag -width "STB_GLOBAL" -compact +.It Dv STB_LOCAL +ローカルなシンボルは、 +それらの定義を含んでいるオブジェクトファイルの外側には、見えません。 +同じ名前のローカルなシンボルは、 +お互いのじゃまをすることなく複数ファイルで存在し得ます。 +.It Dv STB_GLOBAL +グローバルシンボルは、結合されている全てのオブジェクトファイルから見えます。 +あるファイルによるグローバルシンボルの定義は、 +別ファイルの同じシンボルの未定義参照を満足させます。 +.It Dv STB_WEAK +弱いシンボルはグローバルシンボルに似ています。 +しかし、彼らの定義は低い優先順位を持ちます。 +.It Dv STB_LOPROC +この値から +.Sy STB_HIPROC +以下は、プロセッサに固有のセマンティクスのために予約されています。 +.It Dv STB_HIPROC +この値から +.Sy STB_LOPROC +以上は、プロセッサに固有のセマンティクスのために予約されています。 +.Pp +束縛とタイプフィールドのパックおよびアンパック用のマクロがあります: +.Pp +.Bl -tag -width "ELF32_ST_INFO(bind, type)" -compact +.It Xo +.Fn ELF32_ST_BIND info +.Xc +または +.Fn ELF64_ST_BIND info +は、束縛を st_info 値から引出します。 +.It Xo +.Fn ELF64_ST_TYPE info +.Xc +または +.Fn ELF32_ST_TYPE info +は、タイプを st_info 値から引出します。 +.It Xo +.Fn ELF32_ST_INFO bind type +.Xc +または +.Fn ELF64_ST_INFO bind type +は、束縛とタイプを st_info 値へ変換します。 +.El +.El +.Pp +.It Dv st_other +このメンバは、現在 0 を持ち、定義された意味を持ちません。 +.It Dv st_shndx +あらゆるシンボルテーブルエントリは、 +なんらかのセクションに関して +.Dq 定義されています +。 +このメンバは、関連するセクションヘッダテーブルインデックスを持ちます。 +.El +.Pp +再配置は、シンボル参照とシンボル定義を接続する処理です。 +再配置可能なファイルは、それらのセクション内容の +修正方法を記述する情報を持つ必要があります。 +このようにして、実行可能ファイルと共有オブジェクトファイルが、 +プロセスのプログラムイメージのための正しい情報を持てます。 +再配置エントリは、これらのデータです。 +.Pp +加数を必要としない再配置構造体: +.Pp +.Bd -literal -offset indent +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; +.Ed +.Bd -literal -offset indent +typedef struct { + Elf64_Addr r_offset; + Elf64_Size r_info; +} Elf64_Rel; +.Ed +.Pp +加数を必要とする再配置構造体: +.Pp +.Bd -literal -offset indent +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; +.Ed +.Bd -literal -offset indent +typedef struct { + Elf64_Addr r_offset; + Elf64_Size r_info; + Elf64_Off r_addend; +} Elf64_Rela; +.Ed +.Pp +.Bl -tag -width "r_offset" -compact +.It Dv r_offset +このメンバは、再配置動作を適用する場所を与えます。 +再配置可能なファイルでは、 +値は、再配置によって影響を受ける記憶単位の +セクション先頭からのバイトオフセットです。 +実行可能ファイルまたは共用オブジェクトでは、 +値は、再配置によって影響を受ける記憶単位の仮想アドレスです。 +.It Dv r_info +このメンバは、 +再配置されるシンボルテーブルインデックスと、 +使用する再配置のタイプを与えます。 +再配置タイプは、プロセッサ依存です。 +テキストが再配置エントリの再配置タイプまたは +シンボルテーブルインデックスを参照するとき、 +エントリの +.Sy r_info +メンバに対し、それぞれ +.Sy ELF_[32|64]_R_TYPE +または +.Sy ELF[32|64]_R_SYM +を適用する結果を意味しています。 +.It Dv r_addend +このメンバは、定数の加数を指定します。 +これは、再配置可能なフィールドに +格納される値を計算するために使用されます。 +.El +.Sh 関連項目 +.Xr as 1 , +.Xr gdb 1 , +.Xr ld 1 , +.Xr objdump 1 , +.Xr execve 2 , +.Xr core 5 +.Rs +.%A Hewlett Packard +.%B Elf-64 Object File Format +.Re +.Rs +.%A Santa Cruz Operation +.%B System V Application Binary Interface +.Re +.Rs +.%A Unix System Laboratories +.%T Object Files +.%B "Executable and Linking Format (ELF)" +.Re +.Sh 歴史 +ELF ヘッダファイルは、 +.Fx 2.2.6 +で登場しました。 +ELF 自身は、最初に +.At V +で登場しました。 +ELF フォーマットは、標準として採用されています。 +.Sh 作者 +このマニュアルページは、BSDi の +.Bsx +.Xr elf 5 +のマニュアルページに触発されて、 +.An Jeroen Ruigrok van der Werven +.Aq asmodai@FreeBSD.org +が書きました。 |