main() なしで動くCプログラムを書く:コンパイルパイプラインの旅

Writing a (valid) C program without main()

main() なしで動くCプログラムを書く:コンパイルパイプラインの旅

C言語のコンパイルパイプライン(プリプロセッサ、コンパイラ、アセンブラ、リンカ)を順にたどり、通常のHello Worldから始めて、最終的にmain()関数を持たない実行可能バイナリを生成する。カスタムの_startエントリポイントを定義し、glibcに依存せずに生のsyscall(writeとexit)を直接呼び出すことで、有効なELF実行ファイルを作り出す。この過程で、main()は単なる慣習であり、実際のエントリポイントは_startであること、またprintfが動作するにはCランタイムの初期化が必要であることを学ぶ。

main() は便宜上のものであり、必須ではありません。実際のエントリポイントは _start であり、標準Cランタイムは main() を呼び出すコードです。

この日のほかの記事

2026-07-25