Linuxデバイスドライバプログラミングという本のP65、「main関数の呼び出しフロー」にある図を文章にしてメモメモ。
Linuxでプログラムが読み込まれ、起動、終了するまでです。
■プログラムの起動
1.(シェル)コマンドラインから、プログラム(a.out等)を指定されて、
起動要求を受ける
2.(glibc)プログラムを実行すべくexecve呼び出し、システムコール発行される
3.(カーネル)sys_execve()が起動され、
バイナリの検証が行われた後
ローダーが起動される
4.(/lib/ld-linux.so.2)ELFインタープリターが起動され
→ELF:linuxのバイナリ形式
5.(/lib/libc.so.6)Cライブラリが動的にリンクされて
6.(glibc)_libc_start_mainが呼び出される
7.そこから、アプリケーションのmainが呼び出される
■プログラムの実行
8.適当に実行し、場合によってシステムコールが呼ばれ、
9.exitで終了する
■プログラムの終了
10.(glibc)exitでアプリが終了すると、glibcの_exitが呼ばれ、
システムコールが発行されて
11.(カーネル)sys_exitが呼ばれ終了する
図を見る限り、こんなかんじのようだ。