C语言-程序环境(linux下讲解)

目录

C语言标准中的环境

1.两种不同环境

 2. 编译环境阶段的详细内容

a.预编译(预处理)

b.编译

c.汇编

d.链接


C语言标准中的环境

1.两种不同环境

在C语言标准中,存在着两种不同的环境,分别是:

编译环境 将源代码转换成可执行的机器指令
执行环境 执行代码,生成结果
C语言-程序环境(linux下讲解)_第1张图片 环境执行顺序的大致过程

C语言-程序环境(linux下讲解)_第2张图片 文件执行顺序

ps:以上的图解都是大致过程,不可深究全过程

  • 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。
  • 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中

 2. 编译环境阶段的详细内容

因为vs2022集成度太高,不易察觉文件整个执行过程,所以我们在linux系统下进行学习。

前提:已存在test.c文件,内容如下

C语言-程序环境(linux下讲解)_第3张图片

a.预编译(预处理)

想要在预编译这步停下来,需要用到这条指令

 gcc -E test.c -o test.i

 可以看到生成了 test.i 文件

 我们来查看一下里面的内容

查看指令

cat test.i  或者 less test.i 或者 more test.i

C语言-程序环境(linux下讲解)_第4张图片

 总结:

预编译过程中的实现

  1. 头文件的引用
  2. 注释的删除
  3. #define 的替换

b.编译

想要在编译这步停下来,需要用到这条指令 

 gcc -S test.c

 可以看到,又生成一个文件 test.s

继续,让我们来查看一下里面的内容

C语言-程序环境(linux下讲解)_第5张图片

 可以看到非常多的字符串(下面还有,只是没截下来),而这些字符串就是其实是一条条汇编指令。是的,我们可以总结:

编译过程中的实现

  • 将源程序转换成汇编语言

其中转换的细节有很多,如语法分析,词法分析,语义分析,符号汇总,……,这里就不继续深究了,属于汇编原理的知识。

c.汇编

想要在汇编这步停下来,需要用到这条指令 

gcc -c test.s

 又可以看到,又生成了文件 test.o 二进制文件,其实这个就是上面提及到的.obj目标文件

我们继续打开看看,发现是一群乱码

C语言-程序环境(linux下讲解)_第6张图片

也确实是这样,解码方式不一样,二进制文件读出来就是乱码。(如果要阅读可以借助readelf -s test.o)

由此我们可以总结出来:

汇编过程中的实现:

  • 将汇编指令转换成二进制编码

其中还有别实现,比如形成符号表……(就不细讲了,因为我也不太会了,〒▽〒)

d.链接

链接就是最后一步了,我们可以用下面这条指令来执行

gcc test.o -o test 

这里提一下,-o test 是将gcc test.o执行完的文件命名为 test,如果没有就默认命名为a.out

这是执行后的结果

 我们可以知道,执行完指令生成了可执行文件test,这就是编译环境的最终版了。

链接过程中的实现:

  • 合并段表
  • 符号表的合并和重定位

这里也不深究了,因为博主也不会(ಥ﹏ಥ),等我学会了,我再写一篇博客吧。

 最后,推荐一本书籍《程序员的自我修养》,修炼内功的秘典。

你可能感兴趣的:(C/C++,学习,c语言)