C程序编译过程浅析(图文教程)

    前几天看了《程序员的自我修养——链接、装载与库》中的第二章“编译和链接”,主要根据其中的内容简单总结一下C程序编译的过程吧。

    我现在一般都是用gcc,所以自然以GCC编译hellworld为例,简单总结如下。
hello.c源代码如下:

gcc compilation

1.预处理(Preproceessing)

    预处理的过程主要处理包括以下过程:

  •     将所有的#define删除,并且展开所有的宏定义
  •     处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
  •     处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
  •     删除所有注释 “//”和”/* */”.
  •     添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  •     保留所有的#pragma编译器指令,因为编译器需要使用它们

    通常使用以下命令来进行预处理:

    gcc -E hello.c -o hello.i

    参数-E表示只进行预处理 或者也可以使用以下指令完成预处理过程

    cpp hello.c > hello.i      /*  cpp – The C Preprocessor  */

    直接cat hello.i 你就可以看到预处理后的代码

2.编译(Compilation)

    编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。

$gcc –S hello.i –o hello.s

    或者

$ /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c

注:现在版本的GCC把预处理和编译两个步骤合成一个步骤,用cc1工具来完成。gcc其实是后台程序的一些包装,根据不同参数去调用其他的实际处理程序,比如:预编译编译程序cc1、汇编器as、连接器ld

可以看到编译后的汇编代码(hello.s)如下:

static linking

参考资料:

《程序员的自我修养——链接、装载与库》

免责声明:
1;所有标注为智造资料网zl.fbzzw.cn的内容均为本站所有,版权均属本站所有,若您需要引用、转载,必须注明来源及原文链接即可,如涉及大面积转载,请来信告知,获取《授权协议》。
2;本网站图片,文字之类版权申明,因为网站可以由注册用户自行上传图片或文字,本网站无法鉴别所上传图片或文字的知识版权,如果侵犯,请及时通知我们,本网站将在第一时间及时删除,相关侵权责任均由相应上传用户自行承担。
内容投诉
智造资料网打造智能制造3D图纸下载,在线视频,软件下载,在线问答综合平台 » C程序编译过程浅析(图文教程)