Skip to content
Go back

ELFメモ

· Updated:

ELF形式の実行ファイルについて個人的にまとめたものです。内容を信頼しないでください。

実行の流れ

  1. _start:
  2. __libc_start_main:
    1. __libc_csu_init:
      1. (.preinit_arrayの関数を呼び出す)
        • 静的リンクされる場合
      2. .initのプログラムを実行する
        1. .ctorsの関数を呼び出す
      3. .init_arrayの関数を呼び出す
        • 静的変数のコンストラクタ
    2. main
    3. __libc_csu_fini:
      1. .fini_arrayの関数を呼び出す
        • 静的変数のデストラクタ
      2. .finiのプログラムを実行する
        1. .dtorsの関数を呼び出す

CRT

  • CRT = C Run-Time
  • CSU = C Start Up
  • crt0.s:_startを含むエントリポイント周りのプログラム
  • crti.o:.init.finiのfunction prologues
  • crtn.o:.init.finiのfunction epilogues
  • crtbegin.o:.ctors.dtorsのfunction prologues
  • crtend.o:.ctors.dtorsのfunction epilogues

セクション

名前説明
.textプログラムを格納する領域
.rodata定数を格納する領域(ROMに置く)
.data初期値を持つ静的変数を格納する領域(初期値をROMに置き、起動時にRAMへコピーする)
.bss初期値を持たない静的変数を格納する領域(RAMに割り当てる)
.preinit_array動的リンク時に共有データが初期化される前に呼び出される関数の配列
.init_arraymain前に呼び出される関数の配列
.fini_arraymain後に呼び出される関数の配列
.initmain前に実行されるプログラムを格納する領域
.finimain後に実行されるプログラムを格納する領域
.ctorsmain前に呼び出される関数の配列(最近は使われない?)
.dtorsmain後に呼び出される関数の配列(最近は使われない?)

参考文献