Last Update 2020/09/17
-cオプション
ソースファイルのコンパイルおよびアセンブルまでを実行
テスト概要
-c オプションによるCソースファイルのコンパイル
Cソースファイル各々のオブジェクトファイルを生成
-c オプションによるCソースファイルとアセンブラが混在する場合のコンパイル
各々のファイルから各々のオブジェクトファイルを生成
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
使用ファイル
各例共通
sample.h
/* -c オプション動作確認用ヘッダファイル */
#ifndef SAMPLE_H
#define SAMPLE_H
#define TEST_FLG 1
struct Samp
{
int nsamp1;
int nsamp2;
};
int sampFunc(struct Samp s);
#endif /* SAMPLE_H */
sample.c
/* -c オプション動作確認用ソースファイル sample.c */
#include "sample.h"
int sampFunc(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + TEST_FLG;
}
main.c
/* -c オプション動作確認用ソースファイル main.c */
#include "sample.h"
#include <stdio.h>
int main(void)
{
struct Samp smp;
smp.nsamp1 = 1;
smp.nsamp2 = 2;
int n = sampFunc(smp);
printf("n = %d\n", n);
printf("TEST_FLG = %d\n", TEST_FLG);
return 0;
}
-c オプションによるCソースファイルのコンパイル
コンパイル実行
$ ls -l
total 12
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
$ gcc -v -c main.c sample.c
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/ccmxVNPP.s
︙ ^^^ main.cのコンパイル
as -v --64 -o main.o /tmp/ccmxVNPP.s <--- main.cのアセンブル
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o /tmp/ccmxVNPP.s
︙ ^^^ sample.cのコンパイル
as -v --64 -o sample.o /tmp/ccmxVNPP.s <--- sample.cのアセンブル
︙
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64'
$ ls -l リンクは実行されずに終了
total 20
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o <--- 生成されたオブジェクトファイル
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o <--- 生成されたオブジェクトファイル
$
-c オプションによるCソースファイルとアセンブラが混在する場合のコンパイル
テスト用アセンブラファイルの生成
$ ls -l
total 12
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
$ gcc -v -S sample.c
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o sample.s
︙
COLLECT_GCC_OPTIONS='-v' '-S' '-mtune=generic' '-march=x86-64'
$ ls -l
total 16
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s <--- 作成されたアセンブラファイル
$
sample.s(生成されたアセンブラファイル)
.file "sample.c"
.text
.globl sampfunc
.type sampfunc, @function
sampfunc:
.lfb0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %eax
addl %edx, %eax
addl $1, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.lfe0:
.size sampfunc, .-sampfunc
.ident "gcc: (gnu) 8.2.0"
.section .note.gnu-stack,"",@progbits
コンパイル実行
$ gcc -v -c main.c sample.s
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/ccWMFrkM.s
︙ ^^^ コンパイルはmain.cのみ
as -v --64 -o main.o /tmp/ccWMFrkM.s <--- main.cのアセンブル
︙
as -v --64 -o sample.o sample.s <--- sample.sのアセンブル
︙
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64'
$ ls -l
total 24
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o <--- main.cから生成されたオブジェクトファイル
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o <--- sample.sから生成されたオブジェクトファイル
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s
$