刨析C语言的程序环境

Posted Jiawen_captial

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刨析C语言的程序环境相关的知识,希望对你有一定的参考价值。

C语言程序运行的环境

1、程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。见下图:

在翻译环境又可分为编译和链接,在编译过程中又分为:预编译、编译、汇编过程,下面让我们来详细看一下编译+链接过程。

2、详解编译+链接

编译过程

我们将翻译环境分为两个小的过程,编译(依赖编译器,VS下的编译器为cl.exe)和链接(依赖链接器,VS下为link.exe),其中编译又分为预编译、编译、汇编。见下图:

链接过程

每一个源文件都会单独的经过编译器的处理,生成所对应的目标文件,最终通过链接器,把多个目标文件和链接库(包含库函数等)连接在一起,生成我们想要的可执行程序。见下图:

翻译过程详解

以下面代码最终如何关联运行起来的为例来讲:

代码大致要经过预编译、编译、汇编、链接到可执行程序,下面我们来详细刨析每一步的细节:

1、预编译:.c文件->.i文件。 进行的都是文本操作,对文本的删除、替换:1)完成头文件的包含2)预处理指令的处理,如#define的替换等。3)删除注释

2、编译:.i文件->.s文件。把C语言代码转换为汇编代码,在这个过程中要经过:1)语法分析: 2)词法分析 3)语义分析 4)符号汇总:汇总的都是全局的符号,将上面代码左侧的Add,右侧的Add、mian进行汇总。

3、汇编:.s文件->.o文件。把汇编代码转换成二进制指令(机器指令)。在这个过程中完成了:形成符号表

4、链接:1)合并段表:.o的二进制文件elf的格式来组织文件 2)符号表的合并和重定位:舍弃没有实际地址的函数

3、 运行环境

程序执行的过程:

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

以上是关于刨析C语言的程序环境的主要内容,如果未能解决你的问题,请参考以下文章

刨析C语言的程序环境

语句由你控制,详细刨析ifswitch等分支语句

C语言函数栈帧的创建和销毁,以简单函数的调用来进行详细刨析

详细刨析C语言数据的储存

详细刨析C语言数据的储存

深度刨析C语言指针