欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

编译链接的过程会发生什么?-3:翻译环境工作演示

最编程 2024-10-10 07:09:37
...

前提准备:

源文件创建及代码书写:

①:

我们创建一个在gcc中创建一个class110目录,在其下创建一个源文件test.c,在里面写上如图所示的代码

第一阶段:预编译 

①: 然后在终端对test.c这个源文件进行gcc -E -o test.i(-E代表执行完预编译阶段就停止,然后放在test.i这个文件)

 ②:此时生成了test.i这个文件

③:将test.i和test.c进行对比 

解释:

将test.i和test.c进行对比,我们能发现了第一阶段预编译的作用:

1:注释的删除

2:头文件的包含(test.i前面的800+行,就是#include<stdio.h>的内容)

3:#define符号的替换(直接把M替换成了100)

总结:所有的预处理指令(如文件包含、宏定义、条件编译等)都是在预编译阶段完成的。

这些统称为文本操作

第二阶段:编译

①:gcc -S test.i(对test.i进行 -S(执行完第二阶段编译就停止)放进自动生成的test.s中)

解释:此时打开test.s发现全是汇编代码, 所以第二阶段的工作是:将代码翻译成汇编代码,放进了自动生成的test.s中

 第三阶段:汇编

①:gcc -c test.c(执行完第三阶段汇编就停止,放进自动生成的目标文件test.o中)
②:打开test.o,被警告

 解释:打开test.o发现其是二进制文件,所以该阶段的功能:将汇编指令翻译成了二进制指令 

③:强行打开目标文件test.o

解释:ELF是一种文件的格式 ,需要用指令readelf来读取ELF格式的文件

④:用指令readelf来读取ELF格式的文件

 解释:此时返现我们需要输入一些选项(-a,-h,-l.......)来进行选择性的查看 

⑤:-a选项,查看到段表

解释:这就是段表,也就是说ELF这种文件格式,其实是按照一个一个的段来存储的,这也是第四阶段链接中的功能合并段表中所谓的段表 

⑥:-s来查看符号表

解释:

1:此时发现符号表中有我们代码的全局变量g_val,函数Add,函数main,库函数printf

2:这些都被存储到了符号表中 ,这就是第三阶段汇编的另一个作用,形成符号表,那么符号表是做什么的?在第四阶段里面有作用

 第四阶段:链接

①:gcc test.o -0 test(链接生成可执行程序test)

②:打开可执行程序test 

解释:可执行程序test依旧是一个二进制文件,也是可以用ELF打开的

上一篇: 反应速度知识

下一篇: Linux 命令

推荐阅读