第二章:编译和链接_1

第二章:编译和链接_1

2.1 被隐藏了的过程

当我们用GCC编译文件的时候有很多步骤被隐藏了,GCC编译的过程可以分为四个步骤,分别是 预处理编译汇编链接

在这里插入图片描述

2.1.1 预编译

使用命令来让编译器只执行预编译

$gcc -E hello.c -o hello.i
或者
$gcc hello.c > hello.i

预编译的主要过程是处理那些源代码中的以“#”开头的预编译指令。比如“#include”,“#define”等,主要处理规则如下:

  • 将所有的“#define”删除,并且展开所有的宏定义。
  • 处理所有条件预编译指令,比如“#if”,“#ifdef”,“#elif’,“#else”,"#endif”
  • 处理“#include"预编译指令,将被包含的文件插入到该预编译的位置。这个过程是递归的,也就是说被包含的文件还可能包含其他文件。
  • 删除所有的注释“//”和"/**/"。
  • 添加行号和文件名标识,比如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
  • 保留所有的#pragma编译器指令,因为编译器必须要使用它们。

2.1.2 编译

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

现代版本GCC将编译和预编译两个步骤和为了一个步骤,使用一个叫ccl的程序来完成这两个步骤。我们可以直接调用ccl来完成。

$ gcc -S hello.c -o hello.s

实际上GCC其实就是后台的一些编译汇编链接器的包装,它会根据不同的参数要求去调用预编译编译程序CCL,汇编器as,链接器ld。

2.1.3 汇编

汇编器是将汇编代码转换为机器可以执行的指令,每个汇编语句几乎都对应一条机器指令。汇编只需要根据汇编和机器码的对应一一翻译就可以了

$ as hello.s -o hello.o
or 
$ gcc -c hello.s -o hello.o 

2.1.4 链接

链接的过程主要包括了 底座和空间的分配,符号决议,和重定位这些步骤。

这部分后面会专门用一章来写,这里就不再写了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值