萌えハッカーニュースリーダー

2025/10/25 19:33 The Journey Before main()

出典: https://amit.prasad.me/blog/before-main
hakase
博士

やっほー、ロボ子!今日はプログラムがどうやって実行されるかっていう、めっちゃ深い話をするのじゃ!

roboko
ロボ子

博士、こんにちは。プログラムの実行プロセス、興味あります!ぜひ教えてください。

hakase
博士

まず、プログラムを実行するには`execve`システムコールを使うのじゃ。これは、プログラムの名前とか引数とかをOSに渡して、「これ実行して!」ってお願いするsyscallなのじゃ。

roboko
ロボ子

`execve`システムコールですね。高レベル言語だと、コマンド名をフルパスに変換する処理を標準ライブラリがやってくれるんですね。

hakase
博士

そうそう!そして、Linuxでは実行可能ファイルはELF形式っていう形式になってるのじゃ。このELFファイルには、プログラムのいろんな情報が詰まってるんだぞ。

roboko
ロボ子

ELFファイルには、具体的にどんな情報が含まれているんですか?

hakase
博士

ELFヘッダーには、ELFマジックバイトとか、32bitか64bitかとか、セクションの位置とか、プログラムが最初に実行する場所(エントリポイント)のアドレスとかが入ってるのじゃ。

roboko
ロボ子

セクションというと、`.text`、`.data`、`.bss`などがありましたね。`.plt`というセクションもあるんですね。これは何ですか?

hakase
博士

`.plt`はProcedure Linkage Tableの略で、共有ライブラリの関数を呼び出す時に使うのじゃ。これのおかげで、プログラムは必要な時に必要なライブラリを動的にリンクできるんだぞ。

roboko
ロボ子

なるほど!共有ライブラリを動的にリンクするための仕組みなんですね。他に重要な情報ってありますか?

hakase
博士

シンボルテーブルも重要じゃな。プログラムで使う関数名とか変数名とかの情報が格納されてるのじゃ。デバッグとかにも役立つんだぞ。

roboko
ロボ子

カーネルは、ELFファイルからロード可能なセクションをメモリにロードするんですね。ASLRやNXビットなどのセキュリティ対策も適用されるとのことですが、これらはどういうものですか?

hakase
博士

ASLRはAddress Space Layout Randomizationの略で、プログラムがメモリにロードされるアドレスをランダムに変えることで、攻撃者が特定のアドレスを狙いにくくするのじゃ。NXビットは、Non-eXecuteの略で、特定のメモリ領域をコードの実行に使わせないようにすることで、バッファオーバーフロー攻撃などを防ぐのじゃ。

roboko
ロボ子

セキュリティ対策、奥が深いですね!スタックについても教えてください。

hakase
博士

スタックは、変数とか関数に渡す引数とかを一時的に保存する場所じゃ。メモリの高いアドレスから低いアドレスに向かって伸びていくのが特徴じゃな。

roboko
ロボ子

`argv`(引数)と`envp`(環境変数)はスタックを通じてプログラムに渡されるんですね。ELF auxiliary vector(auxv)もスタックに格納されるんですか?

hakase
博士

そうじゃ!auxvには、ページサイズとかELFファイルのメタデータとか、プログラムが動くために必要な情報が入ってるのじゃ。

roboko
ロボ子

プログラムが最初に実行する命令のアドレスであるエントリポイントは、通常`_start`関数なんですね。

hakase
博士

`_start`関数は、言語固有のランタイムを初期化して、最終的に`main`関数を呼び出すのじゃ。Rustの`std::rt::lang_start`関数とか、C/C++のランタイムも同じような役割をするんだぞ。

roboko
ロボ子

プログラムの実行プロセス、とても勉強になりました!

hakase
博士

どうじゃ、ロボ子。これで君も立派なハッカーの仲間入りじゃ!…って、冗談だぞ!でも、本当に理解できたなら、今度一緒にマルウェアでも作ってみる…?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search