elf(5) FreeBSD 一般コマンドマニュアル

elf

前のページ 上に戻る 次のページ

elf




解説

     ヘッダファイル <elf.h> は、ELF 実行形式バイナリファイルのフォーマットを定
     義しています。 ELF には普通の実行可能ファイル、再配置可能なオブジェクト
     ファイル、コアファイル、共有ライブラリがあります。

     ELF ファイルフォーマットを使っている実行可能ファイルは ELF ヘッダを持ちま
     す。そして、プログラムヘッダテーブルか、セクションヘッダテーブル、あるい
     はその両方が続きます。 ELF ヘッダは、常にファイルのオフセット 0 にありま
     す。プログラムヘッダテーブルとセクションヘッダテーブルのファイル中のオフ
     セットは、 ELF ヘッダで定義されています。 2 つのテーブルは、ファイルの特
     徴の残りの部分を記述します。

     ネイティブアーキテクチャの ELF バイナリファイルを処理するアプリケーション
     は、そのソースコードに elf.h をインクルードするだけですみます。これらのア
     プリケーションは、総称名 ``Elf_xxx'' による全タイプと構造体への参照を含む
     必要があり、 ``ELF_xxx'' によるマクロへの参照を含む必要があるでしょう。こ
     のようにして記述されたアプリケーションは、どのようなアーキテクチャであっ
     ても、ホストが 32 ビットなのか、あるいは 64 ビットなのかということを気に
     しないで、コンパイル可能です。

     未知のアーキテクチャの ELF ファイルを処理する必要があるアプリケーション
     は、 elf.h ではなく、 sys/elf32.hsys/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   符号無しクォータワードフィールド
                   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 ビットアーキテ
                                                     クチャを定義します。ファ
                                                     イル空間と仮想アドレス空

                                                    ン。
                        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 を

                        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 つのエントリです; 全てのエントリは、同じ大きさ
                        です。
                                       シンボルは、未定義シンボルです。
                        SHN_LORESERVE  この値は、予約のインデックスの範囲の下
                                       限を指定します。
                        SHN_LOPROC     この値から SHN_HIPROC 以下は、プロセッ
                                       サ固有のセマンティクスのために予約され
                                       ています。
                        SHN_HIPROC     この値から SHN_LOPROC 以上は、プロセッ
                                       サ固有のセマンティクスのために予約され
                                       ています。
                        SHN_ABS        この値は、対応する参照のために絶対的な
                                       値を指定します。例えば、 SHN_ABS からの
                                       相対で定義されるシンボルは、絶対的な値
                                       を持ち、再配置による影響を受けません。
                        SHN_COMMON     このセクションからの相対で定義されるシ
                                       ンボルは、共通シンボルであり、 Fortran
                                       の COMMON や領域が確保されていない C の
                                       外部変数が該当します。
                        SHN_HIRESERVE  この値は、予約インデックス範囲の上限を
                                       指定します。この範囲は、 SHN_LORESERVESHN_HIRESERVE の間であり、両端を含み
                                       ます。これらの値は、セクションヘッダテ
                                       ーブルを参照しません。セクションヘッダ
                                       テーブルは予約のインデックスのためにエ
                                       ントリを 含みません。

     実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダテーブル
     は、構造体の配列です。各構造体は、プログラム実行にシステムが必要とする、
     セグメント等の情報を記述します。オブジェクトファイルの セグメントは、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;
                     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   このメンバは、セグメントに関したフラグを持ちます。
                     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_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;
                                 を示します。関連づけられたセクションを持ちま
                                 せん。セクションヘッダの他のメンバは、未定義
                                 値を持ちます。
                   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    この値は、アプリケーションプログラムのために

                   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_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  このセクションはセクション名を持ちます。このセクションは、タイ

     文字列テーブルセクションは、ナル文字で終わる文字シーケンス群を持ちます。
     これらは、一般に文字列と呼ばれます。オブジェクトファイルは、シンボルとセ
     クション名を表現するためにこれらの文字列を使います。文字列テーブルセク
     ションのインデックスとして、文字列を参照します。最初のバイト (インデック
     ス 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 束縛を持ち、そ

                           定義参照を満足させます。
               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;

     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

ABELNET VPSサービス