linux下编译、链接过程分析

各个阶段如下图所示:

1 预处理阶段

    1.1 操作系统的自带编译器gcc, gcc -E 它是gcc编译器的一个命令,使用后会有对应的应用程序执行处理

    (1)作用:预编译过程主要处理那些源代码中以#开始的预编译指令,比如删除注释

    (2)将所有的#define删除,并且展开所有的宏定义,比如头文件原地展开

    (3)处理所有条件编译指令,如#if,#ifdef等

    (4)添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;


2 编译阶段

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


3 汇编阶段

    (1)汇编就是将汇编代码转变成机器可以执行的命令,生成目标文件(.o),汇编器as根据汇编指令和机器指令的对照表一一翻译即可完成。

                汇编的命令为: 

                gcc –c hello.s –o hello.o     或者从源文件直接输出目标文件:gcc –c hello.c –o hello.o 


4 链接阶段

    (1)链接就是链接器ld将各个目标文件组装在一起,就是把.o文件中的各个函数段按照一定规则累积在一起,比如规则:解决符号依赖,库依赖关系,并生成可执行文件


5 总结:

(1)实际上gcc只是一些其它程序的包装,它会根据不同参数去调用预编译编译程序cc1、汇编器as、链接器ld。

(2)Linux下交叉编译器不是GCC而是制作或下载兼容并适用于自己开发环境的编译器比如arm-linux-gcc,这个编译功能只是交叉编译工具链中的一个小功能而已

(3)实际生成可执行程序过程中,我们都是一部到位,使用gcc hello.c -o hello生成应用程序,完成整个阶段








猜你喜欢

转载自blog.csdn.net/qq_40334837/article/details/80389657