1:预处理阶段
#include <stdio.h>
//源码
int main(int argc, char *argv[])
{
int a = 8;
int b;
a = a+3;
printf("a = %d\n",a);
return 0;
}
把头文件加到test.i文件了:我们可以看见加了好多文件
2:编译阶段(gcc首先要检查代码的规范性、是否有语法错误等,以确定代码所要做的实际工作,检查无误后,
开始把代码翻译成汇编语言)
.file "gdb.c"
.section .rodata
.LC0:
.string "a = %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $8, 28(%esp)
addl $3, 28(%esp)
movl $.LC0, %eax
movl 28(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
3:汇编阶段(汇编代码转换成二进制目标码(不适合人类观看))
4:链接阶段:(把需要的个.o文件 比如代码段整合等,又如在这个程序中没有定义“printf”函数的实现,
在预编译包含进来的“stdio.h”,也只有该函数的声明,而系统把该函数的实现已经放到名为“libc.so.6”
动态链接库了,最终的执行文件,还得.o的整合)