日本語 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.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
ELF(5) FreeBSD ファイルフォーマットマニュアル ELF(5) 名称 elf -- ELF 実行形式バイナリファイルの形式 書式 #include <elf.h> 解説 ヘッダファイル <elf.h> は、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 符号なし 32 ビットプログラムアドレス Elf32_Half 符号なし 16 ビットフィールド Elf32_Lword 符号なし 64 ビットフィールド Elf32_Off 符号なし 32 ビットファイルオフセット Elf32_Sword 符号付き 32 ビットフィールドまたは整数 Elf32_Word 符号なし 32 ビットフィールドまたは整数 64 ビットアーキテクチャのために、次のタイプがあります: Elf64_Addr 符号なし 64 ビットプログラムアドレス Elf64_Half 符号なし 16 ビットフィールド Elf64_Lword 符号なし 64 ビットフィールド Elf64_Off 符号なし 64 ビットファイルオフセット Elf64_Sword 符号付き 32 ビットフィールド Elf64_Sxword 符号付き 64 ビットフィールドまたは整数 Elf64_Word 符号なし 32 ビットフィールド Elf64_Xword 符号なし 64 ビットフィールドまたは整数 ファイル形式が定義するすべてのデータ構造は、関連するクラスのための ``natural'' (自然な) サイズと整列のガイドラインに従います。必要であるな ら、データ構造は、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_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 このバイトの配列は、プロセッサまたはファイルの残りの内 容とは独立に、ファイルを解釈するために指定します。この 配列内で、すべては、接頭辞 EI_ で始まり、接頭辞 ELF で 始まる値を含んでいるかもしれない、マクロによって名前が 付けられています。次のマクロが、定義されています: EI_MAG0 マジックナンバの最初のバイト。それは、 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 スタンドアロン (組 み込み) 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 このメンバは、バイト単位のプログラムヘッダテーブルの ファイルオフセットを保持します。ファイルにプログラム ヘッダテーブルがないなら、このメンバは、0 を保持しま す。 e_shoff このメンバは、バイト単位のセクションヘッダテーブルの ファイルのオフセットを保持します。ファイルにセクション ヘッダテーブルがないなら、このメンバは、0 を保持しま す。 e_flags このメンバは、ファイルに関連するプロセッサ特有のフラグ を保持しています。フラグ名は、形式 EF_`machine_flag' を取ります。現在、フラグは、定義されていません。 e_ehsize このメンバは、バイト単位の ELF ヘッダのサイズを保持し ています。 e_phentsize このメンバは、ファイルのプログラムヘッダテーブルの 1 つのエントリのバイト単位のサイズを保持しています。すべ てのエントリは、同じサイズです。 e_phnum このメンバは、プログラムヘッダテーブルのエントリの数を 保持します。ファイルが、拡張されたプログラムヘッダの番 号付けを使用しているなら、e_phnum メンバは、値 PN_XNUM を含み、プログラムヘッダテーブルエントリの実際の数は、 インデックス SHN_UNDEF でセクションヘッダの sh_info メ ンバに格納されます。e_phentsize の製品とプログラムヘッ ダテーブルエントリの数は、バイト単位のプログラムヘッダ テーブルのサイズを与えます。ファイルにプログラムヘッダ がないなら、e_phnum は、値 0 を保持します。 e_shentsize このメンバは、バイト単位のセクションヘッダのサイズを保 持しています。セクションヘッダは、セクションヘッダテー ブルの 1 つのエントリです。すべてのエントリは、同じサ イズです。 e_shnum このメンバは、セクションヘッダテーブルのエントリの数を 保持します。ファイルが、拡張されたセクションの番号付け を使用しているなら、e_shnum メンバは、0 になり、実際の セクション番号は、インデックス SHN_UNDEF でセクション ヘッダの sh_size メンバに格納されます。ファイルにセク ションヘッダテーブルがないなら、ELF ヘッダの e_shnum と e_shoff フィールドの両方は、0 となります。 e_shentsize の製品とファイルのセクションの数は、バイト 単位のセクションヘッダテーブルのサイズを与えます。 e_shstrndx このメンバは、セクション名の文字列テーブルと関連するエ ントリのセクションヘッダテーブルのインデックスを保持し ます。拡張されたセクションの番号付けが使用されているな ら、このフィールドは、値 SHN_XINDEX を保持し、実際のセ クションヘッダテーブルのインデックスは、インデックス SHN_UNDEF でセクションヘッダエントリの sh_link フィー ルドに存在します。ファイルがセクション名の文字列テーブ ルがないなら、このメンバは、値 SHN_UNDEF を保持しま す。 実行形式または共有オブジェクトファイルのプログラムヘッダテーブルは、構造 体の配列であり、システムが実行のためにプログラムを準備する必要があるセグ メントまたは他の情報をそれぞれ記述しています。オブジェクトファイルセグメ ントは、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_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr; typedef struct { Elf64_Word p_type; Elf64_Word p_flags; Elf64_Off p_offset; Elf64_Addr p_vaddr; Elf64_Addr p_paddr; Elf64_Xword p_filesz; Elf64_Xword p_memsz; Elf64_Xword p_align; } Elf64_Phdr; 32 ビットと 64 ビットのプログラムヘッダの間の主な違いは、全体の struct の p_flags メンバの位置のみです。 p_type Phdr struct のこのメンバは、この配列要素がどんな種類のセ グメントを記述するか、またはどのように配列要素の情報を解 釈するかを伝えています。 PT_NULL 配列要素は、未使用で、他のメンバの値は、未定 義です。これは、プログラムヘッダのエントリを 無視します。 PT_LOAD 配列要素は、ロード可能なセグメントを指定し、 p_filesz と p_memsz によって記述されます。 ファイルからのバイトは、メモリセグメントの最 初にマップされます。セグメントのメモリサイズ (p_memsz) がファイルサイズ (p_filesz) より大 きいなら、``extra'' (余分な) バイトは、値 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 このメンバは、セグメントがメモリ中とファイル中に整列され る値を保持します。ロード可能なプロセスセグメントは、ペー ジサイズのモジュロ (modulo) である p_vaddr と p_offset た めの適合する値がなければなりません。0 と 1 の値は、整列が 必要ではないことを意味します。そうでなければ、p_align は、2 の整数のべき乗である、正であるべきで、p_vaddr は、 p_offset と等しく、モジュロ (modulo) p_align であるべきで す。 ファイルのセクションヘッダテーブルは、すべてのファイルのセクションを位置 付けます。セクションヘッダテーブルは、Elf32_Shdr または Elf64_Shdr 構造体 の配列です。ELF ヘッダの e_shoff メンバは、ファイルの最初からセクション ヘッダテーブルにバイトのオフセットを与えます。e_shnum は、含んでいる、セ クションヘッダテーブルのエントリの数を保持します。e_shentsize は、各エン トリのバイト単位のサイズを保持します。 セクションヘッダテーブルのインデックスは、この配列の添字です。いくつかの セクションヘッダテーブルのインデックスは、予約されています。オブジェクト ファイルは、これらの特別なインデックスのためのセクションがありません: SHN_UNDEF この値は、未定義である、失われる、無関係であるか、またはそ うでなければ、意味のないセクション参照をマークします。例え ば、セクション番号 SHN_UNDEF と関連する ``defined'' (定義 される) シンボルは、未定義なシンボルです。 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_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr; typedef struct { Elf64_Word sh_name; Elf64_Word sh_type; Elf64_Xword sh_flags; Elf64_Addr sh_addr; Elf64_Off sh_offset; Elf64_Xword sh_size; Elf64_Word sh_link; Elf64_Word sh_info; Elf64_Xword sh_addralign; Elf64_Xword 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 このセクションは、シンボルハッシュテーブルを 保持します。動的リンクに関与しているすべての オブジェクトは、シンボルハッシュテーブルを含 んでいなければなりません。オブジェクトファイ ルは、ただ 1 つのハッシュテーブルを持ちます。 SHT_DYNAMIC このセクションは、動的リンクのための情報を保 持します。オブジェクトファイルは、ただ 1 つの 動的なセクションを持ちます。 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 に設定されるなら、属性は、 セクションのための ``on'' (オン) です。そうでなければ、属性 は、``off'' (オフ) であるか、または適用されません。未定義の 属性は、0 に設定されます。 SHF_WRITE このセクションは、プロセスの実行の間に書き込 み可能であるべきデータを含んでいます。 SHF_ALLOC セクションは、プロセスの実行の間にメモリを占 有します。いくつかの制御セクションは、オブ ジェクトファイルのメモリイメージに存在しませ ん。この属性は、それらのセクションのために off (オフ) です。 SHF_EXECINSTR セクションは、実行形式のマシン命令を含んでい ます。 SHF_MASKPROC このマスクに含められているすべてのビットは、 プロセッサ特有のセマンティクスのために予約さ れます。 SHF_COMPRESSED セクションデータは、圧縮されています。 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 このセクションは、プロセスの初期化コードに寄与している実行形式 の命令を保持します。プログラムが実行を開始するとき、システム は、main プログラムのエントリポイントを呼び出す前に、このセク ションのコードを実行するように準備します。このセクションは、タ イプ SHT_PROGBITS があります。使用される属性は、SHF_ALLOC と SHF_EXECINSTR です。 .interp このセクションは、プログラムのインタプリタのパス名を保持しま す。ファイルに、セクションを含むロード可能なセグメントがあるな ら、セクションの属性は、SHF_ALLOC ビットを含みます。そうでなけ れば、そのビットは、off (オフ) です。このセクションは、タイプ SHT_PROGBITS があります。 .line このセクションは、プログラムソースとマシンコードの間の対応を記 述するシンボリックなデバッグのための行番号情報を保持します。内 容は、特定されていません。このセクションは、タイプ SHT_PROGBITS があります。属性タイプは、使用されません。 .note このセクションは、以下に記述された ``Note Section'' (注のセク ション) の形式の情報を保持します。このセクションは、タイプ SHT_NOTE があります。属性タイプは、使用されません。 .plt このセクションは、手続きリンクテーブルを保持します。このセク ションは、タイプ SHT_PROGBITS があります。属性は、プロセッサ特 有です。 .relNAME このセクションは、以下に記述されるようなリロケーション情報を保 持します。ファイルに、リロケーションを含んでいるロード可能なセ グメントがあるなら、セクションの属性は、SHF_ALLOC ビットを含ん でいます。そうでなければ、ビットは、off (オフ) です。慣例によ り、``NAME'' は、リロケーションが適用するセクションによって供 給されます。したがって、.text のためのリロケーションセクション は、通常、名前 .rel.text があります。このセクションは、タイプ SHT_REL があります。 .relaNAME このセクションは、以下に記述されるようなリロケーション情報を保 持します。ファイルに、リロケーションを含んでいるロード可能なセ グメントがあるなら、セクションの属性は、SHF_ALLOC ビットを含ん でいます。そうでなければ、ビットは、off (オフ) です。慣例によ り、``NAME'' は、リロケーションが適用するセクションによって供 給されます。したがって、.text のためのリロケーションセクション は、通常、名前 .rela.text があります。このセクションは、タイプ SHT_RELA があります。 .rodata このセクションは、通常、プロセスイメージの書き込み可能ではない セグメントに寄与している読み込み専用データを保持します。このセ クションは、タイプ SHT_PROGBITS があります。使用される属性は、 SHF_ALLOC です。 .rodata1 このセクションは、通常プロセスイメージの書き込み可能でないセグ メントに寄与している読み込み専用データを保持します。このセク ションは、タイプ SHT_PROGBITS があります。使用される属性は、 SHF_ALLOC です。 .shstrtab このセクションは、セクション名を保持します。このセクションは、 タイプ SHT_STRTAB があります。属性タイプは、使用されません。 .strtab このセクションは、文字列を保持し、最も共通の名前を表している文 字列は、シンボルテーブルエントリに関連します。ファイルに、シン ボル文字列テーブルを含んでいるロード可能なセグメントがあるな ら、セクションの属性は、SHF_ALLOC ビットを含んでいます。そうで なければ、ビットは、off (オフ) です。このセクションは、タイプ SHT_STRTAB があります。 .symtab このセクションは、シンボルテーブルを保持します。ファイルに、シ ンボルテーブルを含んでいるロード可能なセグメントがあるなら、セ クションの属性は、SHF_ALLOC ビットを含んでいます。そうでなけれ ば、ビットは、off (オフ) です。このセクションは、タイプ SHT_SYMTAB があります。 .text このセクションは、プログラムの ``text'' または実行形式の命令を 保持します。このセクションは、タイプ SHT_PROGBITS があります。 使用される属性は、SHF_ALLOC と SHF_EXECINSTR です。 .jcr このセクションは、登録されなければならない Java クラスに関する 情報を保持します。 .eh_frame このセクションは、C++ 例外処理のために使用された情報を保持しま す。 設定された SHF_COMPRESSED フラグがあるセクションは、セクションデータの圧 縮されたコピーを含んでいます。圧縮されたセクションデータは、圧縮アルゴリ ズムと非圧縮データのいくつかの特性をエンコードされた Elf64_Chdr または Elf32_Chdr structure で始まります。 typedef struct { Elf32_Word ch_type; Elf32_Word ch_size; Elf32_Word ch_addralign; } Elf32_Chdr; typedef struct { Elf64_Word ch_type; Elf64_Word ch_reserved; Elf64_Xword ch_size; Elf64_Xword ch_addralign; } Elf64_Chdr; ch_type 使用される圧縮アルゴリズム。ELFCOMPRESS_ZLIB の値は、データ が zlib(3) を使用して圧縮されていることを示します。 ELFCOMPRESS_ZSTD の値は、データが Zstandard を使用して圧縮 されていることを示します。 ch_size 圧縮されていないセクションデータのバイト単位のサイズ。これ は、圧縮されていないデータを含むセクションヘッダの sh_size フィールドに対応しています。 ch_addralign 圧縮されていないセクションデータのアドレス整列。これは、圧 縮されていないデータを含むセクションヘッダの sh_addralign フィールドに対応しています。 文字列テーブルセクションは、共通に文字列と呼ばれるヌル文字で終了する文字 シーケンスを保持します。オブジェクトファイルは、シンボルとセクション名を 表す、これらの文字列を使用します。文字列テーブルセクションへのインデック スとして文字列を参照します。インデックス 0 である最初のバイトは、ヌル文字 を保持するように定義されます。同様に、文字列テーブルの最後のバイトは、す べての文字列に対してヌル文字で終了すること保証して、ヌル文字を保持するた めに定義されます。 オブジェクトファイルのシンボルテーブルは、プログラムのシンボリックな定義 と参照を位置付けて、リロケーションする必要がある情報を保持します。シンボ ルテーブルのインデックスは、この配列への添字です。 typedef struct { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned char st_info; unsigned char st_other; Elf32_Half st_shndx; } Elf32_Sym; typedef struct { Elf64_Word st_name; unsigned char st_info; unsigned char st_other; Elf64_Half st_shndx; Elf64_Addr st_value; Elf64_Xword 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 グローバルシンボルは、結合されているすべてのオブ ジェクトファイルに見えます。グローバルシンボルの 1 つのファイルの定義は、別のファイルの未定義な同じシ ンボルへの参照を満たす。 STB_WEAK ウィーク (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 すべてのシンボルテーブルのエントリは、いくつかのセクションに関 連する ``defined'' (定義される) です。このメンバは、関連するセ クションヘッダテーブルのインデックスを保持します。 リロケーションは、シンボリックな定義があるシンボリックな参照を接続するプ ロセスです。リロケーション可能なファイルは、どのようにそれらのセクション 内容を修正するかを記述する情報がなければなっりません、したがって、プロセ スのプログラムイメージのために正しい情報を保持するために実行形式と共有オ ブジェクトファイルに許可します。リロケーションのエントリは、これらのデー タです。 加数が必要ではないリロケーションの構造体: typedef struct { Elf32_Addr r_offset; Elf32_Word r_info; } Elf32_Rel; typedef struct { Elf64_Addr r_offset; Elf64_Xword 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_Xword r_info; Elf64_Sxword r_addend; } Elf64_Rela; r_offset このメンバは、リロケーションのアクションを適用する位置を与えま す。リロケーション可能なファイルのために、値は、リロケーション によって影響される記憶の単位へのセクションの最初からのバイトオ フセットです。実行形式ファイルまたは共有オブジェクトのために、 値は、リロケーションによって影響される記憶の単位の仮想アドレス です。 r_info このメンバは、リロケーションが行なわなければならない、適用する ロケーションのタイプに関して両方のシンボルテーブルのインデック スを与えます。リロケーションのタイプは、プロセッサ特有です。テ キストがリロケーションエントリのリロケーションのタイプまたはシ ンボルテーブルインデックスを参照するとき、それは、エントリの r_info メンバに、それぞれ、ELF_[32|64]_R_TYPE または ELF[32|64]_R_SYM を適用する結果を意味しています。 r_addend このメンバは、リロケーション可能なフィールドに格納される値を計 算するために使用された定数の加数を指定します。 注意セクション ELF 注意セクションは、次の形式があるエントリから成ります: フィールド サイズ 説明 namesz 32 ビット name のサイズ descsz 32 ビット desc のサイズ type 32 ビット OS 依存の注意タイプ name namesz null で終了するオリジネータ名 desc descsz OS 依存の注意データ name と desc フィールドは、4 バイトの整列を保証するためにパディングされま す。namesz と descsz は、パディングされていない長さを指定します。 FreeBSD は、(desc の対応する解釈で) 次の ELF 注タイプを定義します NT_FREEBSD_ABI_TAG (Value: 1) 予期される ABI バージョンを含んでいる 32 ビット整数の形式で OS ABI バージョンを示します (すなわち __FreeBSD_version)。 NT_FREEBSD_NOINIT_TAG (Value: 2) C スタートアップが初期化ルーチンを呼び出しません、したがって、 rtld(1) は、そうしなければならないことを示します。desc は、無視され ます。 NT_FREEBSD_ARCH_TAG (Value: 3) 実行形式が、構築された MACHINE_ARCH を含みます。 NT_FREEBSD_FEATURE_CTL (Value: 4) 有効にするために、軽減 (mitigations) と機能のビットマスクを含んでい ます: NT_FREEBSD_FCTL_ASLR_DISABLE (Value: 0x01) アドレスのランダム化 (ASLR) を実行しないように、要求します。 security(7) を参照してください。 NT_FREEBSD_FCTL_PROTMAX_DISABLE (Value: 0x02) mmap(2) 呼び出しが、prot 引数の初期の値に PROT_MAX を設定しな いように、要求します。 NT_FREEBSD_FCTL_STKGAP_DISABLE (Value: 0x04) スタックギャップ (gap) を無効にします。 NT_FREEBSD_FCTL_WXNEEDED (Value: 0x08) バイナリが同時に書き込み可能で、実行可能なマッピングを必要と することを示します。 関連項目 as(1), gdb(1), ld(1), objdump(1), readelf(1), execve(2), zlib(3), ar(5), 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 マニュアルページからインスピ レーションを受けて Jeroen Ruigrok van der Werven <asmodai@FreeBSD.org> に よって書かれました。 FreeBSD 13.2 July 25, 2022 FreeBSD 13.2