panda's tech note

ELF

Executable and Linkable Format (ELF)は各種BSDやLinuxで広く使われているオブジェクトフォーマットです。

ELFヘッダ

ELFヘッダは "\x7fELF" (0x7f 0x45 0x4c 0x46) の4バイトのマジック文字列で始まります。この4バイトを含め,最初の16バイトはELF。

typedef struct {
    unsigned char       e_ident[16]; /* Elf Identification */
    Elf64_Half          e_type;      /* Object file type */
    Elf64_Half          e_machine;   /* Machine type */
    Elf64_Word          e_version;   /* Object file version */
    Elf64_Addr          e_entry;     /* Entry point address */
    Elf64_Off           e_phoff;     /* Program header offset */
    Elf64_Off           e_shoff;     /* Section header offset */
    Elf64_Word          e_flags;     /* Processor-specific flags */
    Elf64_Half          e_ehsize;    /* ELF header size */
    Elf64_Half          e_phentsize; /* Size of program header entry */
    Elf64_Half          e_phnum;     /* Number of program header entries */
    Elf64_Half          e_shentsize; /* Size of section header entry */
    Elf64_Half          e_shnum;     /* Number of section header entries */
    Elf64_Half          e_shstrndx;  /* Section name string table index */
} __attribute__ ((packed)) Elf64_Ehdr;

セクション

ELFでは,プログラムの実態(コード)や実行・リンカに必要な情報をセクションに分割して管理しています。一般のプログラムには,プログラムの実態(コード)を定義する.textセクション,リロケーション(.dataセクションや.bssセクションの変数参照をリンカが正しいアドレスに置換する作業)情報を定義する.text.relaセクション,各セクション名の文字列を定義する.shstrtabセクション,変数や関数のシンボル情報を定義する.symtab(シンボルテーブル)セクション,変数名や関数名などの文字列情報を定義する.strtabセクション,グローバル変数を定義する.dataセクション,静的ローカル変数を定義する.bssセクションがあります。これ以外に,デバッグ用のセクションを定義することもあります。