或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。最近はスロット放浪記やってます。。

C言語の基本の基本〜Cソースファイル、オブジェクト、実行形式ファイル

コンパイラ言語であるC言語で実行形式のファイルを生成するには次のステップを踏む。
細かい話は省略する。

  1. ソースファイルを作成する
  2. コンパイルしオブジェクトを生成する
  3. オブジェクトをリンクし実行形式ファイルを生成する

で、実行形式のファイルが実行可能というわけだ。

それぞれのステップで生成するファイルをfileコマンドを使ってどんなファイルであるか定義を見てみる。

空ファイル

touchコマンドで新しいファイル名を指定すると空ファイルが生成される。

$touch test.txt
$more test.txt 
$file test.txt 
test.txt: empty

文字通りtext.txtは空(empty)

Cソースファイル

拡張子が.cの空ファイルは空ファイルと判定される。

$touch test.c
$more test.c
$file test.c
test.c: empty

試しにコンパイルエラーとなるようなエラー込みのCソースファイルでも書いてみる。

$more test.c
#include <stdio.h>

int main(void)
{
$file test.c
test.c: C source, ASCII text

Cソースファイルと判定される。拡張子が.cでemptyじゃないものがCソースファイルという定義っぽい。

オブジェクトファイル

Cソースファイルをコンパイルしたものがオブジェクトファイルである。gccに-cオプションをつけると、コンパイルのみされ、オブジェクトファイルが生成される。

$gcc -c test.c -o test.o
$file test.o
test.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$./test.o
bash: ./test.o: Permission denied

実行形式ファイル

Cソースファイルをコンパイル、リンクすると実行形式のファイルが生成される。
Cソースファイルをコンパイルし、リンクし実行形式のファイルtest1を生成する。

$gcc test.c -o test1
$more test.c
#include <stdio.h>

int main(void)
{
	printf("Hello,World!\n");
}
$./test1
Hello,World!
$file test1
test1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xc1c69b89209e3d0599815e6f3e0e29afd38e67b9, not stripped

あるいは、コンパイル済みのオブジェクトファイルをリンクし実行形式のファイルtest2を生成する。

$gcc -o test2 test.o
$file test2
test2: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xc1c69b89209e3d0599815e6f3e0e29afd38e67b9, not stripped

引数の指定の仕方が慣れないとちょっと難しい。