GCC(GNU Compiler Collection)は、C、C++などのソースコードを、対象プラットフォームの実行可能ファイルへ変換するコンパイラーツールチェーンです。1回のgccコマンドでリンクまで行うこともできますが、内部では複数の段階を経ています。

1. 前処理(Preprocessing)#
#include、#define、条件コンパイルなどを展開します。
gcc -E test.c -o test.itest.iには、ヘッダーファイルの内容やマクロ展開後のソースコードが含まれます。
2. コンパイル(Compilation)#
前処理済みのソースコードをアセンブリコードへ変換します。
gcc -S test.c -o test.s3. アセンブル(Assembling)#
アセンブリコードを機械語とオブジェクトファイルのメタデータへ変換します。
gcc -c test.s -o test.otest.oは、機械語、シンボル、再配置情報などを含む再配置可能オブジェクトファイルです。この段階では外部ライブラリとのリンクが完了していません。
4. リンク(Linking)#
複数のオブジェクトファイルとライブラリを結合し、実行可能ファイルを生成します。
gcc test.o -o testリンカーは外部シンボルを解決し、コードやデータのアドレスを再配置します。
5. 4段階のまとめ#
| 段階 | 入力 | 出力 | 主な処理 |
|---|---|---|---|
| 前処理 | test.c | test.i | include、マクロ、条件コンパイル |
| コンパイル | test.i | test.s | アセンブリコードの生成 |
| アセンブル | test.s | test.o | 機械語、シンボル、再配置情報の生成 |
| リンク | test.o、ライブラリ | test | シンボル解決と実行ファイル生成 |
6. よく使うGCCオプション#
gcc -o output_executable source.c
gcc -c source.c
gcc -S source.c
gcc -E source.c -o source.i
gcc -O2 source.c -o output_executable
gcc -g source.c -o debug_program
gcc -DNAME=value source.c -o output_executable
gcc -I/path/to/include source.c -o output_executable
gcc -L/path/to/lib -lname source.c -o output_executable-c:リンクせず、オブジェクトファイルだけ生成する。-S:アセンブリコードを生成する。-E:前処理だけ行う。-O1、-O2、-O3:最適化レベルを選ぶ。-g:GDBなどで使うデバッグ情報を生成する。-D:プリプロセッサーマクロを定義する。-I:追加のヘッダー検索パスを指定する。-Lと-l:ライブラリの検索パスとライブラリ名を指定する。
7. 生成物を調べる#
file test
readelf -h test
objdump -d test
objdump -t test
hexdump -C test | headreadelf:ELFヘッダー、セクション、プログラムヘッダーを確認する。objdump:逆アセンブル、シンボル、セクション情報を確認する。hexdump:バイナリを16進数とASCIIで表示する。
まとめ#
GCCの流れは、前処理 → コンパイル → アセンブル → リンクです。-E、-S、-cを使うと各段階の生成物を個別に確認できます。中間ファイルを観察すると、Cコードがアセンブリ、オブジェクトファイル、ELF実行ファイルへ変わる仕組みを理解しやすくなります。

