ELF形式の実行ファイルについて個人的にまとめたものです。内容を信頼しないでください。
実行の流れ
_start:__libc_start_main:__libc_csu_init:- (
.preinit_arrayの関数を呼び出す)- 静的リンクされる場合
.initのプログラムを実行する.ctorsの関数を呼び出す
.init_arrayの関数を呼び出す- 静的変数のコンストラクタ
- (
main__libc_csu_fini:.fini_arrayの関数を呼び出す- 静的変数のデストラクタ
.finiのプログラムを実行する.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_array | main前に呼び出される関数の配列 |
.fini_array | main後に呼び出される関数の配列 |
.init | main前に実行されるプログラムを格納する領域 |
.fini | main後に実行されるプログラムを格納する領域 |
.ctors | main前に呼び出される関数の配列(最近は使われない?) |
.dtors | main後に呼び出される関数の配列(最近は使われない?) |