linux下编译、链接过程分析

这篇博客详细分析了Linux下编译链接的过程,包括预处理阶段(处理预编译指令、宏定义和条件编译)、编译阶段(生成汇编代码文件)、汇编阶段(转换为机器可执行的目标文件)和链接阶段(解决符号依赖,生成可执行文件)。通过gcc命令,演示了从源代码到可执行文件的整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各个阶段如下图所示:

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生成应用程序,完成整个阶段

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值