Last Update 2022/11/29
-oオプション
出力ファイル名の指定
テスト概要
-o オプションを使用しない場合の出力ファイル名の確認
各コンパイル段階のデフォルト名でファイルを生成
-o オプションを使用して実行ファイル名を指定してコンパイル
指定したファイル名での実行ファイルの生成
・-o オプションを使用して出力ファイル名を指定して、1つのファイルのアセンブル直前までの処理を実行
・上記で生成されたファイルを利用し、-o オプションでファイル名を指定した実行ファイルの生成
・上記で生成されたファイルを利用し、-o オプションでファイル名を指定した実行ファイルの生成
各段階の指定ファイル名で実行ファイルまでの出力を完了
-o オプションを使用して出力ファイル名を指定して、複数ファイルのアセンブル直前までの処理を実行
FAIL
エラー発生・停止(複数ファイルを伴う場合は出力ファイル名指定不可)
実行環境
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
/* -o オプション動作確認用ヘッダファイル */
#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
/* -o オプション動作確認用ソースファイル sample.c */
#include "sample.h"
int sampFunc(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + TEST_FLG;
}
main.c
/* -o オプション動作確認用ソースファイル 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;
}
-o オプションを使用しない場合の出力ファイル名
コンパイル実行
$ 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.h main.c sample.c <--- コンパイル(アセンブル直前までの処理)を実行
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.h ... -o sample.s --output-pch=sample.h.gch
︙ ^^^ sample.hのコンパイル
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o main.s
︙ ^^^ main.cのコンパイル
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o sample.s
︙ ^^^ sample.cのコンパイル
COLLECT_GCC_OPTIONS='-v' '-S' '-mtune=generic' '-march=x86-64'
$ ls -l
total 1756
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s <--- 生成されたアセンブラファイル(デフォルト「.s」)
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch <--- プリコンパイル済みヘッダファイル(デフォルト「.gch」)
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s <--- 生成されたアセンブラファイル(デフォルト「.s」)
$ gcc -v -c main.s sample.s <--- アセンブルを実行
Using built-in specs.
︙
as -v --64 -o main.o main.s <--- main.sのアセンブル
︙
as -v --64 -o sample.o sample.s <--- sample.sのアセンブル
︙
COLLECT_GCC_OPTIONS='-v' '-c' '-mtune=generic' '-march=x86-64'
$ ls -l
total 1764
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o <--- 生成されたオブジェクトファイル(デフォルト「.o」)
-rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch
-rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o <--- 生成されたオブジェクトファイル(デフォルト「.o」)
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s
$ gcc -v main.o sample.o <--- オブジェクトファイルのリンク
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... main.o sample.o ...
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
$ ls -l
total 1784
-rwxr-xr-x 1 ****** ******** 18392 *** ** **:** a.out <--- 生成された実行ファイル(デフォルト「a.out」)
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 1648 *** ** **:** main.o
-rw-r--r-- 1 ****** ******** 698 *** ** **:** main.s
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rw-r--r-- 1 ****** ******** 1774000 *** ** **:** sample.h.gch
-rw-r--r-- 1 ****** ******** 1216 *** ** **:** sample.o
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample.s
$ ./a.out
n = 4
TEST_FLG = 1
$
-o オプションを使用して実行ファイル名を指定してコンパイル
コンパイル実行
$ 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 -o sample_test main.c sample.c <--- 実行ファイル名を「sample_test」と指定
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/ccOLxSEj.s
︙ ^^^ main.cのコンパイル
as -v --64 -o /tmp/ccqnjcDg.o /tmp/ccOLxSEj.s <--- main.cのアセンブル
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o /tmp/ccOLxSEj.s
︙ ^^^ sample.cのコンパイル
as -v --64 -o /tmp/cc0prnId.o /tmp/ccOLxSEj.s <--- sample.cのアセンブル
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... -o sample_test ...
COLLECT_GCC_OPTIONS='-v' '-o' 'sample_test' '-mtune=generic' '-march=x86-64'
$ ls -l
total 32
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rwxr-xr-x 1 ****** ******** 18392 *** ** **:** sample_test <--- 生成された実行ファイル
$ ./sample_test
n = 4
TEST_FLG = 1
$
-o オプションを使用して出力ファイル名を指定して、1つのファイルのアセンブル直前までの処理を実行
コンパイル実行
$ 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 -o sample_c.asm sample.c <--- 出力ファイル名を「sample_c.asm」と指定して、アセンブル直前までの処理を実行
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -o sample_c.asm
︙
COLLECT_GCC_OPTIONS='-v' '-S' '-o' 'sample_c.asm' '-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 ****** ******** 445 *** ** **:** sample_c.asm <--- 生成されたアセンブラファイル
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
$ gcc -v -o sample_test main.c -x assembler sample_c.asm <--- 実行ファイル名を「sample_test」と指定
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -o /tmp/cca117Ds.s
︙
as -v --64 -o /tmp/cc7G5ZBs.o /tmp/cca117Ds.s
︙
as -v --64 -o /tmp/ccceBGBs.o sample_c.asm
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/collect2 ... -o sample_test ...
COLLECT_GCC_OPTIONS='-v' '-o' 'sample_test' '-mtune=generic' '-march=x86-64'
$ ls -l
total 36
-rw-r--r-- 1 ****** ******** 282 *** ** **:** main.c
-rw-r--r-- 1 ****** ******** 166 *** ** **:** sample.c
-rw-r--r-- 1 ****** ******** 445 *** ** **:** sample_c.asm
-rw-r--r-- 1 ****** ******** 215 *** ** **:** sample.h
-rwxr-xr-x 1 ****** ******** 18392 *** ** **:** sample_test <--- 生成された実行ファイル
$ ./sample_test
n = 4
TEST_FLG = 1
$
-o オプションを使用して出力ファイル名を指定して、複数ファイルのアセンブル直前までの処理を実行
コンパイル実行
$ 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 -o sample_test main.c sample.c <--- 複数ファイルが出力される-Sオプションで出力ファイル名を指定
Using built-in specs.
︙
gcc version 8.2.0 (GCC)
gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
compilation terminated. <--- エラー発生・停止(-c、-Eでも複数ファイルを伴う場合は出力ファイル名指定不可)
$ 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
$