浅析程序的编译

        我们编写源代码经过编译器,最后会得到一个可执行程序,这个就是我们希望得到的,我们平时在编译器上编写代码,编写完成后只需按下Run就可以运行,最后运行结果展示在控制台窗口的黑框框里,如果存在任何问题就会报错。

        上述的这一过程在底层可抽象为下图的这么一个流程

浅析程序的编译_第1张图片        

        程序的源文件经过编译器转换为二进制形式的目标程序.obj文件,目标程序由链接器Linker连接到一起,同时会链接到需要用到的函数库中的函数,这样最后形成一个单一的可执行程序。

        编译这一过程本身可以透明化为四个阶段:

一是预处理阶段:.c 文件经过预处理得到预处理 .i 文件,这一阶段编译主要完成两个任务:

(1)展开代码中的头文件 (2)进行宏替换

        注:这一阶段不进行语法检查

        在Linux下使用 -E 只执行预处理阶段

二是编译阶段:使用 -S只执行编译阶段,.i  文件经过编译得到 .s  汇编文件,这一阶段进行语法检查,语法的错误将在这一阶段被检测出来,也就是报错

 三是汇编阶段:使用 -c 只执行汇编阶段,.s 文件经过汇编得到.o 二进制形式的 .obj 目标文件

最后是链接阶段: 使用 -o 执行链接阶段,.o 文件经过链接得到这个绿色的可执行程序,./ 执行这个文件,这一阶段主要进行段表和符号表的合并和符号表的重定位。

浅析程序的编译_第2张图片

 

你可能感兴趣的:(gnu,p2p,fpga开发)