浅谈编译原理

★写在前面:前面写过一篇博客——>浅浅谈编译原理(真的只是简单的理解了一下),这篇文章在稍微深入的了解编译原理。

疑问一个源文件到可执行文件这中间编译器到底做了什么呢?请看下面:
一个源文件(.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)

扫描二维码关注公众号,回复: 192237 查看本文章
以上内容如有什么问题,欢迎评论,一起学习,也欢迎感兴趣的朋友转载,转载请声明出处。



猜你喜欢

转载自blog.csdn.net/hansionz/article/details/80067803