转自 http://www.cnblogs.com/uvsjoh/archive/2011/08/04/2127912.html
从源文件生成可执行程序所经历的阶段: 预处理、编译、汇编、链接。
1 预处理(preprocessing):预处理器执行源文件中的预处理命令、扩展源文件中的宏。
把包含所有的头文件扩展到源文件,替换源文件中的宏。
预处理阶段影响GCC行为的常用选项如下:
-E:保存预处理输出作为诊断用,打开该选项GCC只执行预处理。
-o: 指定输出的中间文件名,默认输出到标准输出。
-C:阻止预处理器移除源文件和头文件中的注释。
-D name[= definition]
在预处理源文件之前定义符号name。该选项结合源文件中的预处理命令#ifdef name可以用于
条件编译。例如:-D DEBUG可以用来打开调试信息。
-I directory[: directory[...]]
指定搜索头文件的目录。
2 编译(compiling):编译器的核心工作就是把C程序翻译成机器相关的汇编程序(assembly language)。
(不同的CPU架构的机器上,汇编语言通常是不同的) 汇编器(assembler)是指将汇编程序翻译成机器码
的程序。
-S: 为每一个已经编译的输入文件创建一个以.s结尾的汇编语言文件(assembly-language file)。
--fverbose-asm: 在汇编语言语句之后包含注释,注释的内容是该语句所访问的C变量的名字。
3 汇编(assembling):将汇编语言程序翻译成可执行的二进制码。
因为每一种机器架构都有它自己的汇编语言,所有GCC调用一个目标系统的汇编器将汇编语言程序翻译成
可执行的 二进制文件。
-c:保留汇编阶段产生的中间文件--.o文件。
-Wa:传命令行参数给汇编器本身。
-Wa,-as=file.sym: 单独输出所编译模块的符号表到文件file.sym
-Wa,-a=file.list: 在汇编语言程序之后输出所编译模块的符号表到文件file.list
-v: 告诉编译器打印出编译过程中每一步所使用的选项或正在执行的步骤。
-g: 输出文件中包含调试信息。打开该选项,可以在上面的file.list文件中看到汇编语言程序被相应的C语言程序
行所分隔开来。这样我们可以逐行检查编译器是怎么样把C语句翻译成相应的汇编语言的。
4 链接(lingking):链接器把多个二进制目标文件并入一个单独的可执行文件中。链接器必须添加你在程序中
用到的C标准库函数的代码到你的程序中。在链接上下文,一个库是为了更容易处理,而把多个目标文件收集
在一起的一个归档文件。使用工具ar,我们可以创建我们自己的多个已编译的目标文件构成的库。
-l:告诉编译器链接某个特定的库。例如 -lm -- 动态链接libm.so。要静态链接则使用/usr/local/lib/libmath.a。
-L:添加GCC搜索库的目录。