编译系统四步骤——预处理、编译、汇编、链接

理解编译系统:预处理、编译、汇编、链接
本文详细介绍了编译系统的过程,包括预处理(处理头文件、宏定义、条件编译)、编译(将源代码转化为汇编代码)、汇编(生成可重定位目标文件)和链接(组合多个目标文件,解决符号引用)。通过实例展示了gcc编译器如何执行这些步骤。

编译系统

gcc编译器将C程序文件翻译成一个可执行目标文件分为四个阶段(预处理、编译、汇编、链接),执行这四个阶段的程序构成了编译系统
这里写图片描述
以上图援引自《深入理解计算机系统(原书第三版)》


C程序文件/hello.c

#include <stdio.h>

int main(int argc, const char *argv[])
{
    printf("hello world\n");

    return 0;
}

一. 预处理:预处理器(cpp)根据以字符#开头的命令,填充、修改、替换源C程序文件;
编译命令:gcc -E hello.c -o hello.i
主要处理以下内容:

### 嵌入式系统的开发流程 #### 预处理 预处理器负责在编译之前执行一系列准备工作,包括展开所有的头文件、替换程序中的宏定义以及解析条件编译指令并将这些修改后的代码添加到原始文件中[^2]。 ```c #include <stdio.h> #define PI 3.14159 #if defined(DEBUG) // 调试信息 #endif ``` 这段代码展示了如何通过`#include`引入标准库,在实际操作过程中会被替换成对应的实现;同时利用`#define`来创建常量替代符,并且可以根据特定标志的存在与否有条件地包含某些部分的代码。 #### 编译 经过预处理之后得到的新源码会进入编译阶段。在此期间,编译器将C语言这样的高级编程语言转换成低级机器能够理解的形式——即汇编代码(.S)[^1]。此步骤专注于语法分析、语义检查和初步优化工作。 ```assembly .global _start _start: mov $60, %eax /* syscall number for exit */ xor %edi, %edi /* status code 0 */ syscall /* make the system call */ ``` 上述例子表示了一个简单的汇编片段,它由之前的C/C++代码经编译后生成,准备进一步转变为二进制形式的目标文件。 #### 汇编 当获得汇编代码后,下一步就是将其翻译成为计算机可以直接读取并执行的一系列命令序列—也就是常说的目标文件(object file),通常具有.o扩展名。这一过程是由专门设计用来解释汇编语言的工具完成的,称为汇编器(assembler)。 ```bash gcc -c main.c -o main.o ``` 这条命令指示GCC仅进行汇编而不做其他任何事情(比如链接),从而产生名为main.o的对象文件。 #### 链接 最后一个环节涉及把若干个单独编译出来的目标模块组合起来形成完整的应用程序或共享库。这不仅限于静态连接本地产生的obj文件,还包括动态加载外部依赖项如.so(shared object)等资源。整个构建链的最后一站便是链接器(linker), 它还承担着解决符号引用关系的任务,使得不同组件间可以相互调用函数和服务[^3]。 ```bash gcc main.o utils.o -L/path/to/library -lmylib -o myprogram ``` 这里展示的是一个典型的链接命令,其中指定了额外的搜索路径(-L选项) 和需要链接进去的具体库名称 (-l参数).
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值