Provided by: manpages-ja_0.5.0.0.20221215+dfsg-1_all bug

名前

       elf - 実行可能リンクフォーマット (ELF) ファイルのフォーマット

書式

       #include <elf.h>

説明

       ヘッダーファイル  <elf.h> は ELF 実行可能バイナリファイルのフォーマットを定義する。 これら
       のファイルとしては、通常の実行可能ファイル・    再配置可能オブジェクトファイル・コアファイ
       ル・共有ライブラリがある。

       ELF  ファイルフォーマットを使う実行可能ファイルは、  ELF  ヘッダーの後にプログラムヘッダー
       テーブルまたは セクションヘッダーテーブル (またはその両方) が続く構成である。 ELF ヘッダー
       は常にファイルのオフセット 0 にある。 プログラムヘッダーテーブルとセクションヘッダーテーブ
       ルの ファイル内でのオフセットは、ELF ヘッダーに定義されている。 この 2  つのテーブルはファ
       イルの残りの部分の詳細を記述する。

       このヘッダーファイルは上記のヘッダーを C 言語の構造体で記述し、 また動的セクション・再配置
       可能セクション・シンボルテーブルの構造体も 含んでいる。

       以下の型は N ビットアーキテクチャーで使われる (N=32,64 であり ElfNElf32  または  Elf64
       を表し、 uintN_tuint32_t または uint64_t を表す):

           ElfN_Addr       符号なしのプログラムアドレス, uintN_t
           ElfN_Off        符号なしのファイルオフセット, uintN_t
           ElfN_Section    符号なしのセクションインデックス, uint16_t
           ElfN_Versym     符号なしのバージョンシンボル情報, uint16_t
           Elf_Byte        unsigned char
           ElfN_Half       uint16_t
           ElfN_Sword      int32_t
           ElfN_Word       uint32_t
           ElfN_Sxword     int64_t
           ElfN_Xword      uint64_t

       (注意:  *BSD  での用語は少し異なる。 Elf64_HalfElf32_Half の 2 倍であり、 Elf64Quarteruint16_t に用いられる。  混乱を避けるため、以下では、これらの型はサイズが自明な型に置き
       換えてある。)

       このファイルフォーマットが定義する全てのデータ構造体は、  関連するクラスの "自然な" サイズ
       と配置の指針に従う。  必要な場合、データ構造体では明示的なパディング  (padding,  詰め込み)
       が行なわれる。これは  4 バイトオブジェクトに対する 4 バイト配置を保証するためや、 構造体の
       サイズを 4 の倍数にするためなどである。

       ELF ヘッダーは型 Elf32_Ehdr または Elf64_Ehdr で記述される:

           #define EI_NIDENT 16

           typedef struct {
               unsigned char e_ident[EI_NIDENT];
               uint16_t      e_type;
               uint16_t      e_machine;
               uint32_t      e_version;
               ElfN_Addr     e_entry;
               ElfN_Off      e_phoff;
               ElfN_Off      e_shoff;
               uint32_t      e_flags;
               uint16_t      e_ehsize;
               uint16_t      e_phentsize;
               uint16_t      e_phnum;
               uint16_t      e_shentsize;
               uint16_t      e_shnum;
               uint16_t      e_shstrndx;
           } ElfN_Ehdr;

       フィールドは以下の意味を持つ:

       e_ident     このバイト配列は、プロセッサやファイルの他の部分には依存せずに、  ファイルを解
                   釈  (interpret)  するために指定される。 この配列内のすべてのものは、接頭辞 EI_
                   で始まるマクロの名前が付き、接頭辞 ELF で始まる値を持つ。 以下のマクロが定義さ
                   れている:

                   EI_MAG0     マジックナンバーの第  1  バイト。 ELFMAG0 で埋めなければならない。
                               (0: 0x7f)

                   EI_MAG1     マジックナンバーの第 2 バイト。  ELFMAG1  で埋めなければならない。
                               (1: 'E')

                   EI_MAG2     マジックナンバーの第  3  バイト。 ELFMAG2 で埋めなければならない。
                               (2: 'L')

                   EI_MAG3     マジックナンバーの第 4 バイト。  ELFMAG3  で埋めなければならない。
                               (3: 'F')

                   EI_CLASS    第 5 バイトは、このバイナリのアーキテクチャーを示す:

                               ELFCLASSNONE  このクラスは不正である。
                               ELFCLASS32    32 ビットアーキテクチャーを定義する。 ファイルと仮想
                                             アドレス空間が 4  ギガバイトまでのマシンをサポートす
                                             る。
                               ELFCLASS64    64 ビットアーキテクチャーを定義する。

                   EI_DATA     第 6 バイトはファイル内のプロセッサ固有データの データエンコーディ
                               ングを指定する。  現在のところ以下のエンコーディングがサポートされ
                               ている:

                               ELFDATANONE   不明なデータフォーマット。
                               ELFDATA2LSB   2 の補数、リトルエンディアン。
                               ELFDATA2MSB   2 の補数、ビッグエンディアン。

                   EI_VERSION  第 7 バイトは ELF 仕様のバージョン番号である:
                               EV_NONE       不正なバージョン。
                               EV_CURRENT    現在のバージョン。

                   EI_OSABI    第  8 バイトはオブジェクトのターゲットとなるオペレーティングシステ
                               ムと ABI を示す。他の ELF 構造体のフィールドには、プラットフォーム
                               固有の意味を持つフラグや値を持つものもある。これらのフィールドの解
                               釈は、このバイトの値によって決定される。以下に例を挙げる。

                               ELFOSABI_NONE       ELFOSABI_SYSV と同じ。
                               ELFOSABI_SYSV       UNIX System V ABI.
                               ELFOSABI_HPUX       HP-UX ABI.
                               ELFOSABI_NETBSD     NetBSD ABI.
                               ELFOSABI_LINUX      Linux ABI.
                               ELFOSABI_SOLARIS    Solaris ABI.
                               ELFOSABI_IRIX       IRIX ABI.
                               ELFOSABI_FREEBSD    FreeBSD ABI.
                               ELFOSABI_TRU64      TRU64 UNIX ABI.
                               ELFOSABI_ARM        ARM アーキテクチャー ABI.
                               ELFOSABI_STANDALONE スタンドアロン (組み込み) ABI.

                   EI_ABIVERSION
                               第 9 バイトはオブジェクトがターゲットとしている ABI のバージョンを
                               示す。 このフィールドは互換性のない ABI のバージョンを区別するため
                               に使われる。 このバージョン番号の解釈は、 EI_OSABI  フィールドで識
                               別される   ABI  に依存する。  この仕様に準拠するアプリケーションで
                               は、値 0 を使う。

                   EI_PAD      パディングの開始。 これらのバイトは予約されており、0  に設定されて
                               いる。  これらを読み込むプログラムは、これらのバイトを無視すべきで
                               ある。 現在使われていないバイトに意味が与えられる場合、 EI_PAD  の
                               値は将来変更されるかもしれない。

                   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_860      Intel 80860.
                   EM_MIPS     MIPS RS3000 (ビッグエンディアンのみ)。
                   EM_PARISC   HP/PA.
                   EM_SPARC32PLUS
                               拡張命令セット付き SPARC。
                   EM_PPC      PowerPC.
                   EM_PPC64    PowerPC 64-bit.
                   EM_S390     IBM S/390
                   EM_ARM      Advanced RISC Machines
                   EM_SH       Renesas SuperH
                   EM_SPARCV9  SPARC v9 64-bit.
                   EM_IA_64    Intel Itanium
                   EM_X86_64   AMD x86-64
                   EM_VAX      DEC Vax.

       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_phentsizee_phnum の積がテーブルサイズ (バイト単位) になる。 ファイルにプ
                   ログラムヘッダーがない場合、 e_phnum は値 0 を保持する。

                   プログラムヘッダーテーブルのエントリー数が PN_XNUM (0xffff) 以上の場合、  この
                   メンバは  PN_XNUM (0xffff) になり、プログラムヘッダーテーブルの エントリーの実
                   際の数は、セクションヘッダーテーブルの最初のエントリーの sh_info  メンバに格納
                   される。それ以外の場合、セクションヘッダーテーブルの        最初のエントリーの
                   sh_info メンバには値 0 が格納される。

                   PN_XNUM  e_phnum が保持できる最大値を表し、 0xffff に定義されている。  e_phnum
                            はプログラムヘッダーの実際の数がどこに割り当てられているかを示す。

       e_shentsize このメンバはセクションヘッダーのサイズ  (バイト単位)  を保持する。  セクション
                   ヘッダーはセクションヘッダーテーブルの  1  つのエントリーである;  全てのエント
                   リーは同じサイズである。

       e_shnum     このメンバはセクションヘッダーテーブルにあるエントリーの数を保持する。  よって
                   e_shentsizee_shnum  の積はセクションヘッダーテーブルのサイズ  (バイト単位)
                   になる。  ファイルにセクションヘッダーテーブルがない場合、 e_shnum は値 0 を保
                   持する。

                   セクションヘッダーテーブルのエントリー数が SHN_LORESERVE (0xff00) 以上の場合、
                   e_shnum には値 0 が入り、セクションヘッダーテーブルのエントリーの実際の数は セ
                   クションヘッダーテーブルの最初のエントリーの sh_size メンバに格納される。 それ
                   以外の場合、セクションヘッダーテーブルの最初のエントリーの sh_info メンバ には
                   値 0 が格納される。

       e_shstrndx  このメンバはセクション名文字列テーブルに関連付けられたエントリーの  セクション
                   ヘッダーテーブルインデックスを保持する。  ファイルにセクション名文字列テーブル
                   がない場合、 このメンバは値 SHN_UNDEF を保持する。 SHN_UNDEF.

                   セクション名前文字列テーブルのインデックスが SHN_LORESERVE (0xff00) 以上の  場
                   合、このメンバには SHN_XINDEX (0xffff) が入り、セクション名前文字列 テーブルの
                   実際のインデックスはセクションヘッダーテーブルの最初のエントリーの sh_link  メ
                   ンバに格納される。それ以外の場合、セクションヘッダーテーブルの    最初のエント
                   リーの sh_link メンバには値 0 が格納される。

                   SHN_UNDEF     この値は未定義・存在しない・無関係その他、  意味のないセクション
                                 の参照であることを表す。 例えば、セクション番号 SHN_UNDEF に関連
                                 づけて「定義」されたシンボルは、「未定義」なシンボルである。

                   SHN_LORESERVE この値は予約済みのインデックス領域の下限を指定する。

                   SHN_LOPROC    この値以上で SHN_HIPROC 以下の値はプロセッサ固有の意味に予約され
                                 ている。

                   SHN_HIPROC    この値以下で SHN_HIPROC 以上の値はプロセッサ固有の意味に予約され
                                 ている。

                   SHN_ABS       この値は対応する参照の絶対値を指定する。  例えば、セクション番号
                                 SHN_ABS に関連づけられたシンボルは絶対値を保持し、再配置に影響さ
                                 れない。

                   SHN_COMMON    このセクションに関連して定義されたシンボルは、 Fortran の COMMON
                                 や C の未割り当て external 変数のような、 共通シンボルである。

                   SHN_HIRESERVE この値は予約されたインデックスの範囲の上限を指定する。
                                 SHN_LORESERVESHN_HIRESERVE  は含まれる。  この値はセクション
                                 ヘッダーテーブルを参照しない。  つまり、セクションヘッダーテーブ
                                 ルは 予約されたインデックスのエントリーを 含まない 

       実行可能ファイルまたは共有オブジェクトファイルのプログラムヘッダーテーブルは、  システムに
       よるプログラム実行準備に必要な、 セグメント等の情報を記述する構造体の配列である。 オブジェ
       クトファイルの セグメント には 1 つ以上の セクション が含まれる。 プログラムヘッダーは実行
       可能ファイルと共有オブジェクトファイルでのみ意味を持つ。    ファイルは自身のプログラムヘッ
       ダーサイズを ELF ヘッダーの e_phentsize メンバと e_phnum メンバで指定する。 ELF プログラム
       ヘッダーは Elf32_Phdr 型または Elf64_Phdr 型で記述される (どちらになるかはアーキテクチャー
       依存):

           typedef struct {
               uint32_t   p_type;
               Elf32_Off  p_offset;
               Elf32_Addr p_vaddr;
               Elf32_Addr p_paddr;
               uint32_t   p_filesz;
               uint32_t   p_memsz;
               uint32_t   p_flags;
               uint32_t   p_align;
           } Elf32_Phdr;

           typedef struct {
               uint32_t   p_type;
               uint32_t   p_flags;
               Elf64_Off  p_offset;
               Elf64_Addr p_vaddr;
               Elf64_Addr p_paddr;
               uint64_t   p_filesz;
               uint64_t   p_memsz;
               uint64_t   p_align;
           } Elf64_Phdr;

       32 ビットと 64 ビットのプログラムヘッダーの主な違いは、構造体における p_flags メンバの位置
       にある。

       p_type      Phdr 構造体のこのメンバは、 この配列要素がどのような種類のセグメントを記述して
                   いるか、 またはこの配列要素の情報をどのように解釈するか、を表す。

                   PT_NULL     この配列要素は使用されておらず、その他のメンバの値は未定義である。
                               これにより、このプログラムヘッダーのエントリーは無視される。

                   PT_LOAD     この配列要素は  p_fileszp_memsz で記述されるロード可能セグメン
                               トを指定する。  このファイルからのバイトデータが、このメモリーセグ
                               メントの先頭からマップされる。          セグメントのメモリーサイズ
                               Syp_memsz  がファイルサイズ  Syp_filesz  より大きい場合、   「余っ
                               た」バイトは値 0 となり、 そのセグメント初期化データの後ろに置かれ
                               ると定められている。  ファイルサイズはメモリーサイズより大きくては
                               いけない。  プログラムヘッダーテーブルのロード可能セグメントエント
                               リーは、 p_vaddr メンバの昇順にソートされて出現する。

                   PT_DYNAMIC  この配列要素は動的リンク情報を指定する。

                   PT_INTERP   この配列要素は、インタープリターとして起動されるパス名 (ヌル文字終
                               端)  の位置とサイズを指定する。 このセグメント型は (共有オブジェク
                               トにもあるかも知れないが)  実行可能ファイルでのみ意味を持つ。 ただ
                               し、このセグメント型は  1  つのファイルに 2 回以上出現してはならな
                               い。 もし存在する場合、このセグメント型は 全てのロード可能セグメン
                               トエントリーより前になければならない。

                   PT_NOTE     この配列要素は補足情報  (auxiliary information) の位置とサイズを指
                               定する。

                   PT_SHLIB    このセグメント型は予約されているが、意味は指定されていない。  この
                               型の配列要素を保持するプログラムは ABI に準拠しない。

                   PT_PHDR     この配列要素は、もし存在しているならば、  ファイルおよびプログラム
                               のメモリーイメージ双方における  プログラムヘッダーテーブル自身の位
                               置とサイズを指定する。  このセグメント型は 1 つのファイルに 2 回以
                               上出現してはならない。  さらに、このセグメント型が存在してもよいの
                               は、プログラムヘッダーテーブルが  プログラムのメモリーイメージの一
                               部である場合のみである。  もし存在する場合、これは全てのロード可能
                               セグメントエントリーより 前になければならない。

                   PT_LOPROC   この値以上で  PT_HIPROC 以下の値はプロセッサ固有の意味に予約されて
                               いる。

                   PT_HIPROC   この値以下で PT_LOPROC  以上の値はプロセッサ固有の意味に予約されて
                               いる。

                   PT_GNU_STACK
                               GNU  拡張であり、Linux カーネルが p_flags のメンバーにセットされた
                               フラグ経由でスタックの状態を制御するために使用する。

       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_W, PF_R を持つ。

       p_align     このメンバは、セグメントがメモリーおよびファイルにおいて配置 (align)  される値
                   を保持する。 ロード可能プロセスセグメントは、ページサイズを法として p_vaddrp_offset  と合同でなければならない (訳注:「p_vaddr mod ページサイズ = p_offset
                   mod ページサイズ」 でなければならない)。。 0 と 1 という値は配置が必要ないこと
                   を意味する。  それ以外の場合、  p_align  は正で  2  の整数乗でなければならず、
                   p_vaddrp_align   を法として   p_offset   と合同でなければならない   (訳
                   注:「p_vaddr mod p_align = p_offset mod p_align」でなければならない)。

       ファイルのセクションヘッダーテーブルには、    全てのファイルセクションの場所が記述されてい
       る。 セクションヘッダーテーブルは Elf32_Shdr 構造体または Elf64_Shdr  構造体の配列である。
       ELF ヘッダーの e_shoff メンバはファイルの先頭から セクションヘッダーテーブルへのバイトオフ
       セットである。  e_shnum   はセクションヘッダーテーブルに含まれるエントリーの数を保持する。
       e_shentsize は各エントリーのサイズ (バイト単位) を保持する。

       セクションヘッダーテーブルインデックスは、この配列の添字である。  いくつかのセクションヘッ
       ダーテーブルインデックスは予約されている。予約されて            いるのは、最初のエントリー
       と、SHN_LORESERVESHN_HIRESERVE の間の インデックスである。 最初のエントリーは、ELF 拡
       張で e_phnum, e_shnum, e_strndx に使用  される。それ以外の場合、最初のエントリーの各フィー
       ルドには 0 が設定される。 オブジェクトファイルにはこれらの特別なインデックスに対応するセク
       ションはない。

              SHN_UNDEF     この値は、未定義 (undefined)、不足 (missing)、無関係 (irrelevant)、そ
                            の他無意味なセクション参照を示す。

              SHN_LORESERVE この値は予約済みのインデックス領域の下限を指定する。

              SHN_LOPROC    この値以上で  SHN_HIPROC 以下の値はプロセッサ固有の意味に予約されてい
                            る。

              SHN_HIPROC    この値以下で SHN_HIPROC  以上の値はプロセッサ固有の意味に予約されてい
                            る。

              SHN_ABS       この値は対応する参照の絶対値を指定する。       例えば、セクション番号
                            SHN_ABS  に関連して定義されているシンボルは、  絶対値を保持しているの
                            で、再配置に影響されない。

              SHN_COMMON    このセクションに関連して定義されているシンボルは、  FORTRAN の COMMON
                            や C の未割り当て外部変数のような共通シンボルである。

              SHN_HIRESERVE この値は予約済みのインデックス領域の上限を指定する。       システムは
                            SHN_LORESERVESHN_HIRESERVE を含む範囲を予約する。 セクションヘッ
                            ダーテーブルは予約されたインデックスに対応するエントリーを持たない。

       セクションヘッダーは以下の構造体を持つ:

           typedef struct {
               uint32_t   sh_name;
               uint32_t   sh_type;
               uint32_t   sh_flags;
               Elf32_Addr sh_addr;
               Elf32_Off  sh_offset;
               uint32_t   sh_size;
               uint32_t   sh_link;
               uint32_t   sh_info;
               uint32_t   sh_addralign;
               uint32_t   sh_entsize;
           } Elf32_Shdr;

           typedef struct {
               uint32_t   sh_name;
               uint32_t   sh_type;
               uint64_t   sh_flags;
               Elf64_Addr sh_addr;
               Elf64_Off  sh_offset;
               uint64_t   sh_size;
               uint32_t   sh_link;
               uint32_t   sh_info;
               uint64_t   sh_addralign;
               uint64_t   sh_entsize;
           } Elf64_Shdr;

       32 ビットと 64 ビットのセクションヘッダーには実際の違いはない。

       sh_name   このメンバはセクション名を定める。  この値はセクションヘッダー文字列テーブルセク
                 ションのインデックスであり、 ヌル文字で終端された文字列の場所を示す。

       sh_type   このメンバはセクションの内容と意味が含まれるカテゴリーを示す。

                 SHT_NULL       この値はセクションヘッダーが不活性であることを示す。 これは関連す
                                るセクションを持たない。 このセクションヘッダーの他のメンバは、未
                                定義の値を持つ。

                 SHT_PROGBITS   このセクションはプログラムにより定義される情報を保持する。 この情
                                報の形式と意味は、ひとえにプログラムによって決定される。

                 SHT_SYMTAB     このセクションはシンボルテーブルを保持する。 一般には  SHT_SYMTAB
                                はリンク編集のためのシンボルを提供するが、   動的リンクにも使われ
                                る。 完全なシンボルテーブルとして、動的リンクには不要な  多くのシ
                                ンボルを保持できる。 オブジェクトファイルも SHT_DYNSYM セクション
                                を持つことができる。

                 SHT_STRTAB     このセクションは文字列テーブルを保持する。 オブジェクトファイルは
                                複数の文字列テーブルセクションを持つことができる。

                 SHT_RELA       このセクションは明示的な加数  (addend) を持つ再配置エントリーを保
                                持する。 再配置エントリーの型は、オブジェクトファイルの 32 ビット
                                クラスでは Elf32_Rela である。 オブジェクトファイルは複数の再配置
                                セクションを持つことができる。

                 SHT_HASH       このセクションはシンボルハッシュテーブルを保持する。 動的リンクさ
                                れるオブジェクトは、 シンボルハッシュテーブルを含んでいなければな
                                らない。 オブジェクトファイルは 1  つのハッシュテーブルのみを持つ
                                ことができる。

                 SHT_DYNAMIC    このセクションは動的リンクの情報を保持する。 オブジェクトファイル
                                は 1 つの動的セクションのみを持つことができる。

                 SHT_NOTE       このセクションはファイルに何らかの印を付ける情報を保持する。

                 SHT_NOBITS     このタイプのセクションはファイルの領域を使わないという以外は、
                                SHT_PROGBITS と似ている。 このセクションは 1 バイトも含まないが、
                                sh_offset メンバは概念的なファイルオフセットを持つ。

                 SHT_REL        このセクションは明示的な加数を持たない再配置オフセットを保持す
                                る。 再配置オフセットの型は、オブジェクトファイルの 32 ビットクラ
                                スでは Elf32_Rel である。  オブジェクトファイルは複数の再配置セク
                                ションを持つことができる。

                 SHT_SHLIB      このセクションは予約されているが、意味は指定されていない。

                 SHT_DYNSYM     このセクションは動的リンクシンボルの最小セットを保持する。   オブ
                                ジェクトファイルは SHT_SYMTAB セクションも含むことができる。

                 SHT_LOPROC     この値以上で SHT_HIPROC  以下の範囲はプロセッサ固有の意味に予約さ
                                れている。

                 SHT_HIPROC     この値以下で  SHT_LOPROC 以上の範囲はプロセッサ固有の意味に予約さ
                                れている。

                 SHT_LOUSER     この値はアプリケーションプログラムのために予約される インデックス
                                範囲の下限を指定する。

                 SHT_HIUSER     この値はアプリケーションプログラムのために予約される インデックス
                                範囲の上限を指定する。 SHT_LOUSER から SHT_HIUSER  の間のセクショ
                                ンタイプは、 現在または将来のシステム定義セクションタイプと衝突す
                                ることなく、 アプリケーションで使用することができる。

       sh_flags  様々な属性を記述するための 1 ビットのフラグをサポートするセクション。 フラグビッ
                 トが  sh_flags  に設定された場合、そのセクションについての属性は "オン" になる。
                 それ以外の場合、属性が "オフ" であるか属性が適用されない。 未定義の属性は 0 に設
                 定される。

                 SHF_WRITE      このセクションはプロセス実行中に書き込み可能なデータを含む。

                 SHF_ALLOC      このセクションはプロセス実行中にメモリーを使用する。 制御セクショ
                                ンの中には、オブジェクトファイルのメモリーイメージには 存在しない
                                ものもある。 そうしたセクションの場合、この属性はオフである。

                 SHF_EXECINSTR  このセクションは実行可能なマシン命令を含む。

                 SHF_MASKPROC   このマスクに含まれる全てのビットはプロセッサ固有の意味に予約され
                                ている。

       sh_addr   このセクションがプロセスのメモリーイメージにある場合、  このメンバはセクションの
                 最初のバイトが存在するアドレスを保持する。  それ以外の場合、このメンバは  0 であ
                 る。

       sh_offset このメンバの値は、ファイルの先頭からセクションの最初のバイトへの  バイトオフセッ
                 トを保持する。  セクションタイプ SHT_NOBITS はファイルの領域を全く使用せず、この
                 タイプの sh_offset メンバはファイルの概念的な位置を示す。

       sh_size   このメンバはセクションのサイズ  (バイト単位)   を保持する。   セクションタイプが
                 SHT_NOBITS  でない限り、そのセクションはファイル中の  sh_size バイトを使用する。
                 タイプが SHT_NOBITS のセクションはサイズが 0  でないが、ファイルの領域を使用しな
                 い。

       sh_link   このメンバは、セクションヘッダーテーブルインデックスリンクを保持する。  この解釈
                 はセクションタイプに依存する。

       sh_info   このメンバは追加情報を保持する。 この解釈はセクションタイプに依存する。

       sh_addralign
                 アドレス配置に制約があるセクションもある。 セクションが倍長語 (doubleword)  を保
                 持する場合、  システムは全てのセクションについて倍長語の配置を保証しなければなら
                 ない。 つまり、 sh_addr の値は sh_addralign の値を法として 0  と合同でなければな
                 らない  (訳注:「sh_addr mod sh_addralign = 0 でなければならない)。 2 の 0 乗と正
                 の整数乗のみが許可される。 0 または 1 はセクションの配置に制約がないことを意味す
                 る。

       sh_entsize
                 シンボルテーブルのような固定サイズエントリーのテーブルを保持する  セクションもあ
                 る。 このようなセクションでは、 このメンバは各エントリーのサイズ (バイト単位) を
                 表す。  このメンバが 0 の場合、 そのセクションは固定サイズエントリーのテーブルを
                 保持しない。

       さまざまなセクションにプログラム情報・制御情報が保持される:

       .bss      このセクションはプログラムのメモリーイメージに配置される  非初期化データを保持す
                 る。  定義上、システムはプログラムの実行開始時に、データを 0 で初期化する。 この
                 セクションのタイプは SHT_NOBITS である。 属性タイプは SHF_ALLOCSHF_WRITE  で
                 ある。

       .comment  このセクションはバージョン制御情報を保持する。          このセクションのタイプは
                 SHT_PROGBITS である。 属性タイプは使用されない。

       .ctors    このセクションは C++  コンストラクター関数への初期化されたポインターを保持する。
                 このセクションのタイプは   SHT_PROGBITS   である。   属性タイプは  SHF_ALLOCSHF_WRITE である。

       .data     このセクションはプログラムのメモリーイメージに配置される  初期化済みデータを保持
                 する。  このセクションのタイプは SHT_PROGBITS である。 属性タイプは SHF_ALLOCSHF_WRITE である。

       .data1    このセクションはプログラムのメモリーイメージに配置される  初期化済みデータを保持
                 する。  このセクションのタイプは SHT_PROGBITS である。 属性タイプは SHF_ALLOCSHF_WRITE である。

       .debug    このセクションはシンボリックデバッグ用の情報を保持する。  その内容は指定されてい
                 ない。 このセクションのタイプは SHT_PROGBITS である。 属性タイプは使用されない。

       .dtors    このセクションは C++ デストラクタ関数への初期化されたポインターを保持する。 この
                 セクションのタイプは SHT_PROGBITS である。 属性タイプは SHF_ALLOCSHF_WRITE
                 である。

       .dynamic  このセクションは動的リンク情報を保持する。 このセクションの属性は SHF_ALLOC ビッ
                 トを含む。 SHF_WRITE ビットが設定されるか否かはプロセッサによる。 このセクション
                 のタイプは SHT_DYNAMIC である。 上記の属性を参照すること。

       .dynstr   このセクションは動的リンクに必要な文字列を保持する。  最も一般的には、この文字列
                 はシンボルテーブルエントリーと 関連づけられた名前を表す。 このセクションのタイプ
                 は SHT_STRTAB である。 使用される属性タイプは SHF_ALLOC である。

       .dynsym   このセクションは動的リンクシンボルテーブルを保持する。  このセクションのタイプは
                 SHT_DYNSYM である。 使用される属性タイプは SHF_ALLOC である。

       .fini     このセクションはプロセス終了コードに置かれる実行可能命令を保持する。  プロセスが
                 正常に終了した場合、システムはこのセクションにある コードを配置して実行する。 こ
                 のセクションのタイプは SHT_PROGBITS である。 使用される属性タイプは SHF_ALLOCSHF_EXECINSTR である。

       .gnu.version
                 このセクションはバージョンシンボルテーブルを保持する。 その内容は ElfN_Half 要素
                 の配列である。 このセクションのタイプは SHT_GNU_versym である。 使用される属性タ
                 イプは SHF_ALLOC である。

       .gnu.version_d
                 このセクションはバージョンシンボルの定義を保持する。 その内容は ElfN_Verdef 構造
                 体のテーブルである。 このセクションのタイプは SHT_GNU_verdef である。 使用される
                 属性タイプは SHF_ALLOC である。

       .gnu.version_r
                 このセクションはバージョンシンボルが必要とする要素を保持する。        その内容は
                 ElfN_Verneed 構造体のテーブルである。 このセクションのタイプは SHT_GNU_versym で
                 ある。 使用される属性タイプは shf_alloc である。

       .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 である。属性タイプは使用されない。通常 OpenBSD ネイティブ実行  可能ファ
                 イルは自身を識別するために .note.openbsd.ident セクションを持つ。 これによりカー
                 ネルは、ファイルをロードする際に 互換 ELF バイナリエミュレーショ  ンテストを回避
                 できる。

       .note.GNU-stack
                 このセクションは Linux のオブジェクトファイルで スタック属性を宣言するのに使用さ
                 れる。 セクションのタイプは SHT_PROGBITS である。使用される属性は  SHF_EXECINSTR
                 だけである。この属性は  GNU  リンカーに対して オブジェクトファイルが実行可能なス
                 タック (executable stack) を必要とする 示すものである。

       .plt      このセクションは手続き (procedure) リンクテーブルを保持する。 このセクションのタ
                 イプは 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
                 である。

       文字列テーブルセクションはヌル文字で終端されたキャラクター配列  (通常文字列と呼ばれるもの)
       を保持する。 オブジェクトファイルはこれらの文字列を シンボル名とセクション名を表すために使
       う。 文字列は、文字列テーブルセクションへのインデックスとして参照される。  インデックス  0
       の最初のバイトは、ヌルバイト ('\0') を 保持すると定義されている。 同様に文字列テーブルの最
       後のバイトもヌル文字を保持すると定義されている。  これは全ての文字列がヌルバイトで終端され
       ていることを保証するためである。

       オブジェクトファイルのシンボルテーブルは、  プログラムのシンボル定義と参照を配置または再配
       置するのに 必要な情報を保持する。

           typedef struct {
               uint32_t      st_name;
               Elf32_Addr    st_value;
               uint32_t      st_size;
               unsigned char st_info;
               unsigned char st_other;
               uint16_t      st_shndx;
           } Elf32_Sym;

           typedef struct {
               uint32_t      st_name;
               unsigned char st_info;
               unsigned char st_other;
               uint16_t      st_shndx;
               Elf64_Addr    st_value;
               uint64_t      st_size;
           } Elf64_Sym;

       32 ビット版と 64 ビット版は同じメンバを持ち、単に順番が異なるだけである。

       st_name   このメンバはオブジェクトファイルのシンボル文字列テーブルの  インデックスを保持す
                 る。  シンボル文字列テーブルはシンボル名の文字表現を保持する。 この値が 0 でない
                 場合、シンボル名を得るための文字テーブルインデックスを表す。  それ以外の場合、シ
                 ンボルテーブルは名前を持たない。

       st_value  このメンバは関連づけられたシンボルの値を表す。

       st_size   多くのシンボルにはそれに関連づけられたサイズがある。  シンボルがサイズを持たない
                 場合、またはサイズが不明な場合、 このメンバは 0 である。

       st_info   このメンバはシンボルのタイプとバインディング (binding) 属性を指定する:

                 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    弱シンボルは大域的シンボルに似ているが、その定義は優先度が低い。

                 STB_LOPROC  この値以上で STB_HIPROC 以下の範囲はプロセッサ固有の意味に予約されて
                             いる。

                 STB_HIPROC  この値以下で STB_LOPROC 以上の範囲はプロセッサ固有の意味に予約されて
                             いる。

                             バインディングとタイプフィールドを  パックしたりアンパックしたりする
                             マクロがある:

                             ELF32_ST_BIND(info)   または ELF64_ST_BIND(info)  st_info の値からバ
                             インディングを取り出す。

                             ELF32_ST_TYPE(info)  または ELF64_ST_TYPE(info)
                             st_info の値からタイプを取り出す。

                             ELF32_ST_INFO(bind, type)  または ELF64_ST_INFO(bind, type)
                             バインディングとタイプを st_info の値に変換する。

       st_other  このメンバはシンボルの visibility (見える範囲) を規定する。

                 STV_DEFAULT     デフォルトのシンボル visibility ルール。
                 STV_INTERNAL    プロセッサ固有の隠しクラス。
                 STV_HIDDEN      シンボルは他のモジュールからは利用できない。
                 STV_PROTECTED   横取りできず (not preemptible)、公開されない。

                 visibility 種別を抽出するためのマクロがある。

                 ELF32_ST_VISIBILITY(other)  または ELF64_ST_VISIBILITY(other)

       st_shndx  各シンボルテーブルエントリーは、いくつかのセクションに関連して     "定義されてい
                 る"。 このメンバは関連するセクションヘッダーテーブルインデックスを保持する。

       再配置はシンボル参照とシンボル定義を結合するプロセスである。  再配置可能ファイルはセクショ
       ンの内容をどのように修正するかに関する  情報を持たなければならない。  これにより、実行可能
       ファイルと共有オブジェクトファイルは  プロセスのプログラムイメージについての正しい情報を持
       つことができる。 再配置エントリーは以下のようなデータである。

       加数を必要としない再配置構造体。

           typedef struct {
               Elf32_Addr r_offset;
               uint32_t   r_info;
           } Elf32_Rel;

           typedef struct {
               Elf64_Addr r_offset;
               uint64_t   r_info;
           } Elf64_Rel;

       加数を必要とする再配置構造体。

           typedef struct {
               Elf32_Addr r_offset;
               uint32_t   r_info;
               int32_t    r_addend;
           } Elf32_Rela;

           typedef struct {
               Elf64_Addr r_offset;
               uint64_t   r_info;
               int64_t    r_addend;
           } Elf64_Rela;

       r_offset    このメンバは再配置動作が適用される位置を与える。  再配置可能ファイルの場合、こ
                   の値はセクションの先頭から  再配置で影響を受ける格納単位 (storage unit) までの
                   バイトオフセットである。 実行可能ファイルまたは共有オブジェクトの場合、 この値
                   は再配置で影響を受ける格納単位の仮想アドレスである。

       r_info      このメンバは、再配置が行われなければならないシンボルテーブルインデックスと、
                   適用される再配置のタイプの両方を与える。  再配置タイプはプロセッサ毎に異なる。
                   テキストが再配置エントリーの再配置タイプ  またはシンボルテーブルインデックスを
                   参照している場合、   それぞれエントリーの   r_info    メンバに対して、それぞれ
                   ELF[32|64]_R_TYPEELF[32|64]_R_SYM を適用した結果を意味する。

       r_addend    このメンバは定数の加数を指定する。  この加数は再配置可能フィールドに格納される
                   値を計算するために使われる。

       .dynamic セクションは、関連する動的リンク情報を保持している 一連の構造体を保持する。 d_tag
       メンバは d_un の解釈を制御する。

           typedef struct {
               Elf32_Sword    d_tag;
               union {
                   Elf32_Word d_val;
                   Elf32_Addr d_ptr;
               } d_un;
           } Elf32_Dyn;
           extern Elf32_Dyn _DYNAMIC[];

           typedef struct {
               Elf64_Sxword    d_tag;
               union {
                   Elf64_Xword d_val;
                   Elf64_Addr  d_ptr;
               } d_un;
           } Elf64_Dyn;
           extern Elf64_Dyn _DYNAMIC[];

       d_tag     このメンバは以下の値を持つことができる:

                 DT_NULL     動的セクションの終りのマーク

                 DT_NEEDED   必要なライブラリの名前への文字列テーブルオフセット

                 DT_PLTRELSZ PLT 再配置 (reloc) テーブルのサイズ (バイト単位)

                 DT_PLTGOT   PLT と GOT (または何れか一方) のアドレス

                 DT_HASH     シンボルハッシュテーブルのアドレス

                 DT_STRTAB   文字列テーブルのアドレス

                 DT_SYMTAB   シンボルテーブルのアドレス

                 DT_RELA     Rela 再配置テーブルのアドレス

                 DT_RELASZ   Rela テーブルのサイズ (バイト単位)

                 DT_RELAENT  Rela テーブルエントリーのサイズ (バイト単位)

                 DT_STRSZ    文字列テーブルのサイズ (バイト単位)

                 DT_SYMENT   シンボルテーブルエントリーのサイズ (バイト単位)

                 DT_INIT     初期化関数のアドレス

                 DT_FINI     終了関数のアドレス

                 DT_SONAME   共有オブジェクトの名前への文字列テーブルオフセット

                 DT_RPATH    ライブラリ検索パスへの文字列テーブルオフセット (推奨されない)

                 DT_SYMBOLIC リンカーがシンボルの実行可能ファイルより前に  この共有オブジェクトを
                             検索した場合は、警告を出す。

                 DT_REL      Rel 再配置テーブルのアドレス

                 DT_RELSZ    Rel テーブルのサイズ (バイト単位)

                 DT_RELENT   Rel テーブルエントリーのサイズ (バイト単位)

                 DT_PLTREL   PLT が参照する再配置テーブルのタイプ (Rela または Rel)

                 DT_DEBUG    デバッグのために使用されている。内容は定義されていない。

                 DT_TEXTREL  これが指定されていない場合、  書き込み不可のセグメントには再配置は適
                             用されない。

                 DT_JMPREL   PLT 専用の再配置エントリーのアドレス

                 DT_BIND_NOW 実行可能ファイルに制御を譲る前に、  全ての再配置を処理するように動的
                             リンカーに指示する。

                 DT_RUNPATH  ライブラリ検索パスへの文字列テーブルオフセット

                 DT_LOPROC   プロセッサ固有の意味の開始

                 DT_HIPROC   プロセッサ固有の意味の終了

       d_val     このメンバは様々な意味に解釈される整数値である。

       d_ptr     このメンバはプログラムの仮想アドレスを表す。 これらのアドレスを解釈する際に、 実
                 際のアドレスは元々のファイルの値と メモリーの基底アドレスから計算される。 ファイ
                 ルにはこれらのアドレスを修正するための 再配置エントリーを含めてはならない。

       _DYNAMIC  .dynamic セクションにある全ての動的構造体を含む配列。 これは自動的にリンカーに渡
                 される。

注意

       ELF は System V で初めて登場した。 ELF 自体は System V で初めて登場した。 ELF フォーマット
       は採択された標準である。

       e_phnum, e_shnum, e_strndx に対する拡張は、いずれも Linux での拡張で ある。Sun, BSD, AMD64
       もこれに対応している。詳しい情報は、関連項目を参照。

関連項目

       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).

       Sun Microsystems, Linker and Libraries Guide.

       AMD64  ABI  Draft,  System  V  Application  Binary  Interface AMD64 Architecture Processor
       Supplement.

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部  である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。