-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
빌드 자체에 많은 영향을주지 않고 모든 빌드 스크립트에 쉽게 추가 할 수 있다는 것입니다.
이 옵션에 대한 또 다른 멋진 점은 다음을 추가하는 것입니다 -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에서 테스트되었습니다.