Binary2.0勉強会 8

ひとまず目標は「gcc -o hoge hoge.c」で何が起きて何が出来るか理解するとかで

とか第0回で言ってたので、そっち方面に進みます。


Cのソースコードが実行形式になるまでの道は長く険しいのだ。

  1. プリプロセス
  2. コンパイル
  3. アセンブル
  4. リンク

全部を全部 gcc がやっているということはなくって、実は gcc は内部で別のプログラムを呼んでて、gcc の仕事はそれらのコマンドをどうこうする部分のようです。
おもむろに gcc --help すると、

  -v                       コンパイラによって起動されるプログラムを表示

とかあるので試してみましょう。

niha@hoge:~/src/c$ gcc -v bin05.c
Using built-in specs.
Target: i486-linux-gnu
コンフィグオプション: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr (略)
スレッドモデル: posix
gcc バージョン 4.2.3 (Ubuntu 4.2.3-2ubuntu7)
 /usr/lib/gcc/i486-linux-gnu/4.2.3/cc1 -quiet -v bin05.c (略)
存在しないディレクトリ "/usr/local/include/i486-linux-gnu" を無視します
存在しないディレクトリ "/usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/include" を無視します
存在しないディレクトリ "/usr/include/i486-linux-gnu" を無視します
#include "..." の探索はここから始まります:
#include <...> の探索はここから始まります:
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.2.3/include
 /usr/include
探索リストの終わり
GNU C version 4.2.3 (Ubuntu 4.2.3-2ubuntu7) (i486-linux-gnu)
	compiled by GNU C version 4.2.3 (Ubuntu 4.2.3-2ubuntu7).
GGC heuristics: --param ggc-min-expand=64 --param ggc-min-heapsize=64428
Compiler executable checksum: cd267a1ce4b47763f08e41c54a4f8f5c
 as --traditional-format -V -Qy -o /tmp/ccIevCFL.o /tmp/ccvXJifO.s
GNU assembler version 2.18.0 (i486-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.18.0.20080103
 /usr/lib/gcc/i486-linux-gnu/4.2.3/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker (略)

cc1 as collect2 の三つがわけわからんオプションいっぱいつけて呼ばれてるようです。
4つの工程があったはずなんですが三つしかないですね。これ以上続けると長さが半端になりそうなのでここで切って、次回は三つのプログラムの簡単な説明を。