第1回勉強会の概要
僕は所用で休んでしまったので、出れなかったです。。
なので、社内で共有している情報をまとめます。
C言語で実行ファイルが出来るまでの流れ
コンパイラオプションを指定することで
といった指定が可能。
(はてなダイアリーでうまくアスタリスクを表示できないので、hogeで代用)
hoge.c
↓プリプロセス #で始まるコメント以外の部分を処理する。テキストに対しての処理を行う
(hoge.I) ほとんどファイルに吐き出すことは無い
↓コンパイル
hoge.s
↓アセンブル
hoge.o オブジェクトのo。この場合、binaryファイルであることを示す。Javaのオブジェクトやオブジェクト指向とは全く関係ないので注意。
↓リンク、ロード
a.out hoge.exe (a.outとはassembler outputから取ったファイル名)
C言語のソースをコンパイルしてアセンブラにした場合、名前の重複防止のために関数名や変数名の先頭に_(アンダースコア)が自動的につけられる。
また、$や@はC言語では名前として使用できないため、アセンブラで名前をつける際に$や@を使用して重複を避ける方法もある。
複数個のファイルを結合する方法として
- #include "test1.c"によってプロプロセッサに処理させて一つのファイルとして結合する方法
- それぞれ*.oファイルまで処理を行い、リンカーによって結合させる方法
がある。
それぞれ正しい方法だが、ファイル数が増えれば増える程プリプロセス、コンパイル、アセンブルにかかるコストが高くなり、時間がかかるため、一般的には2の方法が用いられている。
例)1の方法の場合
#include "file1.c"
#include "file2.c"
・
・
#include "file100.c"
という風に記述されているファイルのfile2.cだけを変更する場合にも全ての処理を全てのファイルに対して行わなければならない。
例)2の方法の場合
file1.c file2.c ・・・ file100.c
↓ ↓ ||| ↓
file1.o file2.o ・・・ file100.o
gcc file1.o file2.o ・・・・ file100.o
とすればよいため、修正したファイルのみ.oファイルを作成しなおせばリンク処理にかけることが出来る。
今回、僕が取ったのは2だったのですが、こちらの方が一般的らしいですね。