Last Update 2020/12/19
-aux-info ファイル
翻訳単位内で宣言・定義された全ての関数のプロトタイプ宣言をファイルに出力
テスト概要
サンプルファイルの関数宣言を、プロトタイプ宣言リストファイルに出力して内容を確認
実行環境
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
/* -aux-info オプション動作確認用ヘッダファイル */
#ifndef SAMPLE_H
#define SAMPLE_H
#define TEST_FLG 1
struct Samp
{
int nsamp1;
int nsamp2;
};
/* 関数プロトタイプによる宣言 */
int sampFunc1(struct Samp s);
/* 関数名のみによる関数宣言 */
int sampFunc2();
/* 関数プロトタイプによる宣言 */
int sampFunc3(struct Samp s);
#endif /* SAMPLE_H */
sample.c
/* -aux-info オプション動作確認用ソースファイル sample.c */
#include "sample.h"
/* 記憶域クラスをstaticとして定義 */
static int sampFuncs(struct Samp s, int n)
{
return s.nsamp1 + s.nsamp2 + n;
}
/* ヘッダファイルで関数プロトタイプにより宣言 */
int sampFunc1(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + TEST_FLG;
}
/* ヘッダファイルで関数名のみによる関数宣言 */
int sampFunc2(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + sampFuncs(s, TEST_FLG);;
}
/* ヘッダファイルでの宣言なし */
int sampFunci(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + 3;
}
/* ヘッダファイルで関数プロトタイプにより宣言 */
int sampFunc3(struct Samp s)
{
return s.nsamp1 + s.nsamp2 + sampFunci(s);;
}
main.c
/* -aux-info オプション動作確認用ソースファイル main.c */
#include "sample.h"
#include <stdio.h>
int main(void)
{
struct Samp smp;
smp.nsamp1 = 1;
smp.nsamp2 = 2;
int n1 = sampFunc1(smp);
int n2 = sampFunc2(smp);
int n3 = sampFunc3(smp);
int ni = sampFunci(smp);
printf("n1 = %d\n", n1);
printf("n2 = %d\n", n2);
printf("n3 = %d\n", n3);
printf("ni = %d\n", ni);
printf("TEST_FLG = %d\n", TEST_FLG);
return 0;
}
動作テスト
main.cのコンパイル
$ gcc -v -c -aux-info main.prot main.c
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v main.c ... -aux-info main.prot ...
︙
main.c: In function ‘main’:
main.c:15:11: warning: implicit declaration of function ‘sampFunci’; did you mean ‘sampFunc3’? [-Wimplicit-function-declaration]
int ni = sampFunci(smp); <--- 暗黙宣言に関する警告
^~~~~~~~~
sampFunc3
︙
as -v --64 -o main.o /tmp/ccQUPnK4.s
︙
COLLECT_GCC_OPTIONS='-v' '-c' '-aux-info' 'main.prot' '-mtune=generic' '-march=x86-64'
$
生成されたプロトタイプ宣言リスト(main.prot)
行頭コメント ---> /* ファイル名:行:宣言の内容を表す記号 */
行頭コメント ---> /* ファイル名:行:宣言の内容を表す記号 */
記号1文字目 I : 暗黙宣言 N : プロトタイプ O : 非プロトタイプ
記号2文字目 C : 宣言 F : 定義
記号2文字目 C : 宣言 F : 定義
行末コメント ---> /* K&Rスタイルの引数リスト */ (定義の場合のみ)
/* compiled from: . */
/* sample.h:15:NC */ extern int sampFunc1 (struct Samp);
/* sample.h:18:OC */ extern int sampFunc2 (/* ??? */);
/* sample.h:21:NC */ extern int sampFunc3 (struct Samp);
/* /usr/include/stdio.h:146:NC */ extern int remove (const char *);
︙ この間stdio.hに関するプロトタイプ宣言
/* /usr/include/stdio.h:865:NC */ extern int __overflow (FILE *, int);
/* main.c:6:NF */ extern int main (void); /* () */
/* main.c:15:IC */ extern int sampFunci (/* ??? */);
sample.cのコンパイル
$ gcc -v -c -aux-info sample.prot sample.c
Using built-in specs.
︙
/usr/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/cc1 -quiet -v sample.c ... -aux-info sample.prot ...
︙
as -v --64 -o sample.o /tmp/ccv0aRiJ.s
︙
COLLECT_GCC_OPTIONS='-v' '-c' '-aux-info' 'sample.prot' '-mtune=generic' '-march=x86-64'
$
生成されたプロトタイプ宣言リスト(main.prot)
行頭コメント ---> /* ファイル名:行:宣言の内容を表す記号 */
行頭コメント ---> /* ファイル名:行:宣言の内容を表す記号 */
記号1文字目 I : 暗黙宣言 N : プロトタイプ O : 非プロトタイプ
記号2文字目 C : 宣言 F : 定義
記号2文字目 C : 宣言 F : 定義
行末コメント ---> /* K&Rスタイルの引数リスト */ (定義の場合のみ)
/* compiled from: . */
/* sample.h:15:NC */ extern int sampFunc1 (struct Samp);
/* sample.h:18:OC */ extern int sampFunc2 (/* ??? */);
/* sample.h:21:NC */ extern int sampFunc3 (struct Samp);
/* sample.c:6:NF */ static int sampFuncs (struct Samp s, int n); /* (s, n) struct Samp s; int n; */
/* sample.c:12:NF */ extern int sampFunc1 (struct Samp s); /* (s) struct Samp s; */
/* sample.c:18:NF */ extern int sampFunc2 (struct Samp s); /* (s) struct Samp s; */
/* sample.c:24:NF */ extern int sampFunci (struct Samp s); /* (s) struct Samp s; */
/* sample.c:30:NF */ extern int sampFunc3 (struct Samp s); /* (s) struct Samp s; */