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
セクションがあります。これ以外に,デバッグ用のセクションを定義することもあります。