目录
命令
$
gcc -E hello.c -o hello.i
$gcc -S hello.i -o hello.s
$gcc -c hello.s -o hello.o
$gcc hello.o -o hello
$
$./hello
hello world!
pre-compiled here!
static __always_inline void func
C程序
// hello.c
#include <stdio.h>
#define PREPROCESSING "Pre-processing"
static __always_inline void func(void)
{
printf("static __always_inline void func\n");
return;
}
int main(int argc, const char *argv[])
{
printf("Hello world!\n");
printf("%s here!\n", PREPROCESSING);
func();
return 0;
}
预处理(Preprocessing)
将宏、头文件等代码替换
到被调用处,不检查语法
。
预处理结果就是将stdio.h 文件中的内容插入到test.c中了。
预处理文件格式为.i
// hello.i
/* 内容省略stdio.h */
# 2 "hello.c" 2
static __inline __attribute__ ((__always_inline__)) void func(void)
{
printf("static __always_inline void func\n");
return;
}
int main(int argc, const char *argv[])
{
printf("hello world!\n");
printf("%s here!\n", "pre-processing");
func();
return 0;
}
编译(Compilation)
将c语言代码编译为最高效的汇编语言代码
,并检查语法
。
汇编文件格式为.s
// hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "hello world!"
.LC1:
.string "%s here!\n"
.LC2:
.string "pre-processing"
.align 8
.LC3:
.string "static __always_inline void func"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movl $.LC0, %edi
call puts
movl $.LC1, %eax
movl $.LC2, %esi
movq %rax, %rdi
movl $0, %eax
call printf
movl $.LC3, %edi
call puts
movl $0, %eax
leave
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.4.7-8ubuntu1) 4.4.7"
.section .note.GNU-stack,"",@progbits
汇编(Assembly)
将汇编代码
编译为目标文件
。
目标文件格式为.o
链接(Linking)
将程序的目标文件
与所需的所有附加的目标文件
连接起来,最终生成可执行文件
。附加的目标文件包括静态连接库
和动态连接库
。
此步骤最终生成可执行程序
。