程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
创始人
2024-05-23 18:46:04
0

编译与链接

  • 前言
  • 程序的环境
  • 程序的编译与链接
  • 写在最后


前言

每当我们运行一段代码时,编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件(.exe), 有了这个可执行文件,便可以执行我们写的程序了。那么编译器对代码的编译以及生成可执行程序的过程是怎样的呢?这个问题便是本文章将要探讨的。


程序的环境

ANSI C的任何一种实现中,存在两个不同的环境,一种是翻译环境,一种是执行环境

  • 翻译环境:在这个环境中源代码被转换为可执行的机器指令;
  • 执行环境:这个环境用于实际执行代码。

补充:

在这里插入图片描述

程序的编译与链接

首先看看 翻译环境 的简图:
在这里插入图片描述

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

编译本身也分为几个阶段:
预编译 —> 编译 —> 汇编

在这里插入图片描述

  • 预编译(预处理)

预处理阶段要做的事情主要是这些:

  1. #include 头文件的包含;
  2. #define定义符号的替换和删除;
  3. 注释的删除。

接下来在linux中用gcc编译器对一段代码进行预处理,如下:

在这里插入图片描述
预处理过后,我们观察test.i这个预编译后的文件:

指令:gcc -E test.c -o test.i

在这里插入图片描述

可以看到,代码一下子膨胀了许多,这正是因为头文件被包含进来了,当来原先的#define与注释也不见了。


  • 编译

编译阶段是将C语言代码翻译成汇编代码, 其过程有:

  1. 语法分析;
  2. 词法分析;
  3. 语义分析;
  4. 符号汇总

符号汇总就是将相关的函数,以及全局变量汇总:

例如以下代码汇总后客观图:

在这里插入图片描述
将上述代码编译后:

指令:gcc -S test.c -o test.s

在这里插入图片描述

可以看到,C语言被翻译成了汇编代码。


  • 汇编
  1. 汇编是将汇编代码翻译成了二进制指令(存放目标文件),也就是生成目标文件的一步(test.o
  2. 汇编使汇总的符号形成符号表,也就是每个符号对应一个地址。

如下:
在这里插入图片描述

就将上述代码汇编,我们来看看test.o是不是二进制文件呢?

指令:gcc -c test.c -o test.o

在这里插入图片描述

可以看到,的确是一些二进制乱码。


通过编译的一系列过程后,接下来就是链接了

链接的相关过程有:
1. 合并段表(这里不解释,需了解细读《程序员的自我修养》这本书,里面对整个编译链接部分都有很详细的讲解)
2. 符号表的合并和重定位。

这里只讲解符号表的合并:

  1. 在上面所探讨的编译过程,每一个文件都会形成自己的目标文件,在汇编这一步,又会形成自己的符号表;
  2. 如果一个程序有两个文件,就会有两个符号表,所以,符号表的合并,就是链接的一步。

例如test1.c文件和test2.c文件的符号表合并过程:

在这里插入图片描述

最终,通过链接器和链接库将各个目标文件链接后形成可执行文件。


程序执行的过程:

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

写在最后

如果说,你对这一块特别感兴趣,想继续深入,你可以读《程序员的自我修养》这本书,这本书里对这一块的知识有很详细的解析。

感谢阅读本小白的博客,错误的地方请严厉指出噢!

相关内容

热门资讯

小燕子遇险记小学作文(实用3... 小燕子遇险记小学作文 篇一小燕子遇险记今天,我看到了一幅令人心碎的画面,那是一只小燕子遇到了巨大的困...
小学优秀作文【优选6篇】 小学优秀作文 篇一:我最喜欢的运动我最喜欢的运动是篮球。我对篮球的热爱始于我还是个小小孩的时候。每当...
写盼望的小学作文(实用6篇) 写盼望的小学作文 篇一盼望新学期的到来新学期即将开始,我感到无比的盼望和激动。我盼望着新的课程、新的...
立硬币小学作文(精简3篇) 立硬币小学作文 篇一我喜欢立硬币的游戏我是一个小学生,最近我发现了一个很有趣的游戏,那就是立硬币。这...
记忆里的歌小学作文(实用3篇... 记忆里的歌小学作文 篇一:童年的音符小时候,我家住在一个小村庄里,那里的生活简单而宁静。每天早晨,我...
在我的记忆深处小学生作文【经... 在我的记忆深处小学生作文 篇一快乐的操场时光记忆深处的小学时光,让我难以忘怀的便是在操场上的快乐时光...
观星作文【优选6篇】 观星作文 篇一夜空中的繁星闪烁着神秘的光芒,吸引着人们的目光。每当我仰望星空,都会被它们的美丽和无穷...
军训小学生作文【精彩6篇】 军训小学生作文 篇一军训,是我小学生活中最令人难忘的经历之一。我记得那是一个炎热的夏天,我和同学们来...
对生命充满热爱小学作文(精选... 对生命充满热爱小学作文 篇一:赞美自然之美生命是一种奇妙的礼物,我们应该对生命充满热爱。而对我来说,...
我会洗衣服小学作文【通用6篇... 我会洗衣服小学作文 篇一我会洗衣服我是一名小小家务达人,最近我学会了洗衣服。虽然洗衣服是一项看起来简...
风之歌小学作文(精彩3篇) 风之歌小学作文 篇一风之歌我喜欢风,因为它给我带来快乐和自由。风是无形的,但它却有无穷的力量。有时,...
圣诞节快乐小学作文(精彩4篇... 圣诞节快乐小学作文 篇一圣诞节快乐圣诞节是一个充满欢乐和祝福的节日。每年的12月25日,人们都会庆祝...
我们的校园小学作文【推荐6篇... 我们的校园小学作文 篇一我们的校园小学我们的校园小学位于一座美丽的小城市中,校园环境优美,设施齐全,...
初中作文人叙事作文【精简3篇... 初中作文人叙事作文 篇一:迷失的小鸟春天的午后,阳光明媚,我和爸爸一起在家门口的小花园里晒太阳。突然...
没想到我如此浮躁小学作文【经... 没想到我如此浮躁小学作文 篇一最近,我发现自己变得越来越浮躁了,总是坐立不安,无法专注于一件事情。我...
喜迎新春送福上门小学作文【最... 喜迎新春送福上门小学作文 篇一春节是中国最重要的传统节日之一,也是全国人民共同期盼的节日。每年的春节...
描写中秋佳节的小学作文【精选... 描写中秋佳节的小学作文 篇一中秋佳节是中国传统的重要节日之一,它在农历八月十五这一天举行。中秋节是一...
家乡的变化小学作文500字(... 篇一:家乡的变化我家乡是一个美丽的小镇,位于山区。这几年来,随着经济的发展和科技的进步,我家乡发生了...
彩虹作文【最新5篇】 彩虹作文 篇一彩虹是一种美丽的自然现象,也是大自然给予我们的一份礼物。每当下过雨后,太阳从云层中露出...
桃树和松树小学作文(通用3篇... 桃树和松树小学作文 篇一桃树和松树是我们学校校园里最引人注目的两棵树。它们虽然不同,但都给我们带来了...