-save-temps
これは、心に留めておくとよい別のオプションです。
gcc -save-temps -c -o main.o main.c
main.c
#define INC 1
int myfunc(int i) {
return i + INC;
}
現在、通常の出力main.o
に加えて、現在の作業ディレクトリには次のファイルも含まれています。
main.i
は、次の内容が含まれている必要なファイルを含みます。
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "main.c"
int myfunc(int i) {
return i + 1;
}
main.s
ボーナスです:-)と生成されたアセンブリが含まれています:
.file "main.c"
.text
.globl myfunc
.type myfunc, @function
myfunc:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
addl $1, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size myfunc, .-myfunc
.ident "GCC: (Ubuntu 8.3.0-6ubuntu1) 8.3.0"
.section .note.GNU-stack,"",@progbits
多数のファイルに対して実行する場合は、代わりに使用することを検討してください:
-save-temps=obj
これにより、中間ファイルが-o
現在の作業ディレクトリではなくオブジェクト出力と同じディレクトリに保存され、潜在的なベース名の競合が回避されます。
このオプションの利点は-E
、ビルド自体に大きな影響を与えることなく、任意のビルドスクリプトに簡単に追加できることです。
このオプションのもう1つの優れた点は、以下を追加した場合です-v
。
gcc -save-temps -c -o main.o -v main.c
実際には、下の醜い一時ファイルの代わりに使用されている明示的なファイルが表示される/tmp
ため、前処理/コンパイル/アセンブリの手順を含む、何が行われているのかを正確に知るのは簡単です。
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu main.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector-strong -Wformat -Wformat-security -o main.i
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase-strip main.o -version -fstack-protector-strong -Wformat -Wformat-security -o main.s
as -v --64 -o main.o main.s
Ubuntu 19.04 amd64、GCC 8.3.0でテスト済み。