hello world被隐藏了的过程(一)

hello world 几乎是每个程序员第一个接触的程序,编译运行一气呵成,基本成了程序入门和开发环境测试的默认标准。


在LINUX下我们使用gcc来编译hello world时,只需使用最简单的命令:

$gcc hello.c
$./a.out

实际上,上述过程可以分为四个步骤,分别是:预处理,编译,汇编,链接。


预处理

源代码和相关的头文件被预编译器预编译成一个.i文件(c++是.ii)。

预处理过程主要是处理源码中以#开始的预编译指令,处理规则如下:

将所有#define删除,并展开所有的宏定义。
处理所有条件预编译指令,如#if,#ifdef,#elif,#else,#endif
处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
删除所有的注释
添加行号和文件名标识,以便于编译时产生调试用的行号信息,和编译错误时能够显示行号。
保留所有的#pragma,因为编译器需要使用它们。

编译

编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语意分析,优化产生相应的汇编代码。这个过程往往是我们所说的整个构建过程中的核心部分,也是最复杂的部分之一。现在版本的gcc把预处理和编译合成了一步,产生hello.s


汇编

汇编器是将汇编代码转换成机器码,就是根据对应关系将其一一翻译。


链接

链接通常是一个让人比较费解的一个过程,为啥汇编器不直接输出可执行文件而是输出一个目标文件呢?

我们可以看到将一大堆文件链接起来才能够得到a.out,即最终的执行文件。

未完待续……

你可能感兴趣的:(hello world被隐藏了的过程(一))