Linux GCC生成可执行程序的4个步骤——预处理、编译、汇编、链接

本文详细解析了GCC编译器的四个主要阶段:预编译、编译、汇编和链接。介绍了每个阶段的操作步骤及主要作用,如预编译阶段处理宏定义、条件编译指令、包含文件等,编译阶段进行词法分析、语法分析、源代码优化等,为读者提供了深入理解GCC工作原理的视角。

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

一,预编译

操作步骤:gcc -E hello.c -o hello.i

主要作用:

处理关于 “#” 的指令

【1】删除#define,展开所有宏定义。例#define portnumber 3333

【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif

【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,文件内可能包含其他“.h”文件。

【4】删除所有注释。/**/,//。

【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。

【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。

二,编译(编译器主要做了什么)

操作步骤:gcc -s hello.c -o hello.s

主要作用:1.扫描(词法分析),2.语法分析,3.语义分析,4.源代码优化(中间语言生成),5.代码生成,目标代码优化。

【1】将源代码程序输入扫描器,将源代码的字符序列分割成一系列记号。例array[index] =  (index + 4) * (2 + 6);

【2】基于词法分析得到的一系列记号,生成语法树。

【3】由语义分析器完成,指示判断是否合法,并不判断对错。又分静态语义:隐含浮点型到整形的转换,会报warning,

  动态语义:在运行时才能确定:例1除以3

【4】中间代码(语言)使得编译器分为前端和后端,前端产生与机器(或环境)无关的中间代码,编译器的后端将中间代码转换为目标机器代码,目的:一个前端对多个后端,适应不同平台。

【5】编译器后端主要包括:代码生成器:依赖于目标机器,依赖目标机器的不同字长,寄存器,数据类型等

    目标代码优化器:选择合适的寻址方式,左移右移代替乘除,删除多余指令。

三,汇编

操作步骤:gcc -c hello.c -o hello.o

主要作用:汇编器是将汇编代码转变成可以执行的指令,生成 目标文件。

四,链接

操作步骤:gcc hello.o -o hello

主要作用:通过编译器的5个步骤后,我们获得目标代码,但是里面的各个地址还没有确定,空间还没有分配。

链接过程主要包括:地址和空间的分配,符号决议和重定位。

地址和空间:略

符号决议:也可以说地址绑定,分动态链接和静态链接,

重定位:假设此时又两个文件:A,B。A需要B中的某个函数mov的地址,未链接前将地址置为0,当A与B链接后修改目标地址,完成重定位。
--------------------- 
作者:huoyahuoya 
来源:优快云 
原文:https://blog.youkuaiyun.com/huoyahuoya/article/details/53083424 

<think>我们被要求详细解释gcc编译过程的步骤预处理编译汇编链接,并分别给出对应的命令。 然后,根据规则,在最后提出3-5个相关问题。 步骤详解: 1. 预处理(Preprocessing):处理源代码中的预处理指令,如宏定义、文件包含、条件编译等。 命令:gcc -E source.c -o output.i (生成预处理后的文件,通常以.i为后缀) 2. 编译(Compilation):将预处理后的文件转换为汇编代码。 命令:gcc -S source.i -o output.s (生成汇编代码文件,以.s为后缀) 3. 汇编(Assembly):将汇编代码转换为机器可执行的目标代码(二进制文件)。 命令:gcc -c source.s -o output.o (生成目标文件,以.o为后缀) 4. 链接(Linking):将一个或多个目标文件以及所需的库文件链接成最终的可执行文件。 命令:gcc source.o -o executable (生成可执行文件,默认为a.out,或通过-o指定) 注意:也可以一步完成所有步骤,即直接使用 gcc source.c -o executable。 下面按照要求,用中文详细解释每一步,并给出示例命令。</think>### GCC 编译过程的个关键步骤及对应命令 #### 1. 预处理(Preprocessing) ```bash gcc -E source.c -o output.i ``` - **作用**:处理所有以 `#` 开头的预处理指令 - **处理内容**: - 展开头文件 `#include` - 宏替换 `#define` - 条件编译 `#ifdef/#endif` - 删除所有注释 - **输出文件**:`.i` 后缀(可读文本文件) #### 2. 编译(Compilation) ```bash gcc -S output.i -o output.s ``` - **作用**:将预处理后的代码转换为汇编语言 - **关键过程**: - 语法和语义分析 - 生成中间表示(IR) - 代码优化 - 生成目标架构的汇编指令 - **输出文件**:`.s` 后缀(汇编语言文本) #### 3. 汇编(Assembly) ```bash gcc -c output.s -o output.o ``` - **作用**:将汇编代码转换为机器码 - **核心操作**: - 解析汇编指令 - 生成二进制操作码(opcode) - 创建目标文件格式(ELF/Mach-O/COFF) - **输出文件**:`.o` 后缀(可重定位目标文件) #### 4. 链接(Linking) ```bash gcc output.o -o executable ``` - **作用**:合并多个目标文件和库函数 - **关键任务**: - 符号解析(解决函数/变量引用) - 重定位(分配最终内存地址) - 合并标准库(如 libc) - 生成可执行文件格式 #### 完整过程示例 ```bash # 步独立执行 gcc -E hello.c -o hello.i gcc -S hello.i -o hello.s gcc -c hello.s -o hello.o gcc hello.o -o hello # 单步完成(gcc自动处理所有阶段) gcc hello.c -o hello ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值