浅谈编译原理

22 篇文章 0 订阅

 

疑问一个源文件到可执行文件这中间编译器到底做了什么呢?请看下面:

一个源文件(.c)在编译器经过编译和链接两个大的过程而生成可执行文件(.exe),而编译又分为分为三个阶段:预处理(预编译)、编译、汇编,这是一个翻译的过程。而可执行文件生成在运行环境可以直接运行。下面是程序编译的过程。

●组成一个程序的每一个源文件通过编译过程生成目标代码。

●每个目标文件由连接器捆绑在一起,形成一个单一而完整的可执行程序。

●链接器同时引入程序所用到的函数,然后链接在程序中。

 

 

 

 

疑问预处理、编译和汇编编译器又做了什么事呢?事实上,在Windows系统下的编辑器都是集成的,所以我们来到Linux系统下gcc编译器看一下预处理、编译、汇编分别都做了什么事,生成了什么文件。

①写一个test.c文件

 

②预处理,用gcc -E test.c >test.i,将test.c 预处理后的文件放在test.i中,然后我们看一下test.i的内容

好吧!大概就是看不懂。大哭其实是一些头文件的引入、#define的替换、注释的删除等等,在下面会有总结!

 

 

③编译,用命令gcc -S test.i >test.s,将编译后的内容放入test.s中,我们在看一下test.s中的内容:

 

好吧!算我输,还是看不懂啊!哎,等等,好像有一些熟悉的东西,eax、edx这不是寄存器嘛,看来是汇编代码呀。编译的作用就是把语言代码转换成汇编代码,当然还要进行一系列的分析(语法分析、语义分析、词法分析、符号汇总)来检查代码,下面会有总结:

 

④汇编,用命令gcc -c test.s >test.o把test.s 汇编的东西放在test.o中,我们再来看看test.o的内容:

完蛋了,什么也看不懂呀!惊恐这个看不懂真的没有关系,因为这是一堆机器指令,只有那些大牛才可能看的懂吧!因此,汇编的作用就是把汇编代码转换为机器指令。当然也有工具可以解析机器指令readelf,汇编的作用还有生成符号表,就是在编译期间产生的符号汇总给他们地址,我们用readelf test.o -s看一下:

 

那下面我们对预处理、编译、汇编的作用进行总结:

 

 

★什么是合并段表和合并符号表,sum.c是另一个源文件,里边的内容是Add函数的声明,它只有一个符号表(Add)

 

 

以上内容如有什么问题,欢迎评论,一起学习,也欢迎感兴趣的朋友转载,转载请声明出处。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值