-save-temps
Đây là một lựa chọn tốt khác cần lưu ý:
gcc -save-temps -c -o main.o main.c
C chính
#define INC 1
int myfunc(int i) {
return i + INC;
}
và bây giờ, ngoài đầu ra bình thường main.o
, thư mục làm việc hiện tại còn chứa các tệp sau:
main.i
là tệp được đánh giá trước mong muốn có chứa:
# 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
là một phần thưởng :-) và chứa assembly đã tạo:
.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
Nếu bạn muốn làm điều đó cho một số lượng lớn tệp, hãy xem xét sử dụng thay thế:
-save-temps=obj
trong đó lưu các tệp trung gian vào cùng thư mục với -o
đầu ra đối tượng thay vì thư mục làm việc hiện tại, do đó tránh được xung đột tên cơ sở tiềm ẩn.
Ưu điểm của tùy chọn -E
này là có thể dễ dàng thêm nó vào bất kỳ tập lệnh xây dựng nào mà không can thiệp nhiều vào chính quá trình xây dựng.
Một điều thú vị khác về tùy chọn này là nếu bạn thêm -v
:
gcc -save-temps -c -o main.o -v main.c
nó thực sự hiển thị các tệp rõ ràng đang được sử dụng thay vì các tệp tạm thời xấu xí /tmp
, do đó, rất dễ dàng để biết chính xác điều gì đang xảy ra, bao gồm các bước tiền xử lý / biên dịch / lắp ráp:
/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
Đã thử nghiệm trong Ubuntu 19.04 amd64, GCC 8.3.0.