Fork Me
gcc初探
03 Feb 2015 - by @ssdr

##gcc编译 ###预编译: 处理源代码文件中,以“#”开始的预编译命令,如“#include”, “#define”

  • —-将所有的#define删除,并展开所有的宏定义
  • —-处理所有条件预编译指令,如”#if”,”#ifdef”, “#elif”, “#else”, “#endif”
  • —-处理#include预编译指令,将包含的文件插入到预编译指令的位置,这个过程是递归进行的。
  • —-删除所有的注释
  • —-添加行号和文件名标识,比如#2 “hello.c” 2,以便于编译时编译器产生调试用的等号信息,及用于编译时产生编译错误或警告时能够显示行号

gcc -E 预处理阶段后结束
gcc -E hello.c -o hello.i

###编译:

  • —-词法分析
  • —-语法分析
  • —-语义分析
  • —-优化

gcc -S 编译阶段后结束,不assemble,默认.s命名
gcc -S hello.i -o hello.s

实际gcc将参预编译和编译由一个命令来完成:cc1

###汇编: 将汇编代码转变成机器代码,每一个汇编语句几乎都对应一条机器指令

gcc -c 编译并assemble源代码,但不链接,默认.o命名
as hello.s -o hello.o

###链接: 实际产生一个可执行hello程序的链接过程:

ld -static -o xxx xxx.o