编译是计算机的编译器基于编程语言、目标机器的指令集和操做系统的约定去生成机器码(machine code)的过程。
GCC C 编译器(linux下是cc编译器)生成的就是汇编码(assember code)的一种形式。而汇编码是机器码不一样程序指令给出的文本表示。
GCC 同时调用一个汇编器(assember code)和连接器(linker)从汇编码中生成可执行的机器码。-- csapp书 p188linux
好比咱们使用了这样的命令:编程
gcc -o my_exe p1.c p2.c
这条简单的gcc命令实际上包含4个过程:windows
1.预处理:
C 预处理器(preprocesor)会把须要的#include 标识的文件和#define声明的宏(macros) 添加到源代码(source code)中。
2.编译:
C 编译器会生成汇编码,依据源码生成了相应的两个p1.s 和p2.sapp
3.汇编:
汇编器把上面的汇编码转换成二进制的目标文件(object-code file) p1.o 和 p2.o. 目标代码是机器码的一种二进制文本形式--它包含了所有的指令。可是没有包含全局变量的地址。编程语言
4.连接:
连接器归并这两个目标文件和代码须要调用的库函数(好比printf),生成了可执行(excutable)的机器码--文件 my_exe函数
参考这篇: https://blog.csdn.net/xiaohouye/article/details/52084770编码
值得注意的地方:操作系统
三.编译过程的流程图
我绘制了一个完整的C编译系统的流程:.net