メインコンテンツへスキップ
  1. ノート/
  2. ツールとデプロイ/

GCCの紹介

·1088 文字·3 分· loading · loading · · ·
ICE345
著者
ICE345
CS Student | System | Linux | OCaml

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

GCCのコンパイルフロー

1. 前処理(Preprocessing)
#

#include#define、条件コンパイルなどを展開します。

gcc -E test.c -o test.i

test.iには、ヘッダーファイルの内容やマクロ展開後のソースコードが含まれます。

2. コンパイル(Compilation)
#

前処理済みのソースコードをアセンブリコードへ変換します。

gcc -S test.c -o test.s

3. アセンブル(Assembling)
#

アセンブリコードを機械語とオブジェクトファイルのメタデータへ変換します。

gcc -c test.s -o test.o

test.oは、機械語、シンボル、再配置情報などを含む再配置可能オブジェクトファイルです。この段階では外部ライブラリとのリンクが完了していません。

4. リンク(Linking)
#

複数のオブジェクトファイルとライブラリを結合し、実行可能ファイルを生成します。

gcc test.o -o test

リンカーは外部シンボルを解決し、コードやデータのアドレスを再配置します。

5. 4段階のまとめ
#

段階入力出力主な処理
前処理test.ctest.iinclude、マクロ、条件コンパイル
コンパイルtest.itest.sアセンブリコードの生成
アセンブルtest.stest.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 | head
  • readelf:ELFヘッダー、セクション、プログラムヘッダーを確認する。
  • objdump:逆アセンブル、シンボル、セクション情報を確認する。
  • hexdump:バイナリを16進数とASCIIで表示する。

まとめ
#

GCCの流れは、前処理 → コンパイル → アセンブル → リンクです。-E-S-cを使うと各段階の生成物を個別に確認できます。中間ファイルを観察すると、Cコードがアセンブリ、オブジェクトファイル、ELF実行ファイルへ変わる仕組みを理解しやすくなります。


评论