C语言程序的环境,编译+链接

一、程序的翻译环境(编译和链接)

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

  • 第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令。
  • 第二种是执行环境,它用于实际执行代码。

如下图:就是我们编译器编译一个源文件到一个可执行文件的大致过程
在这里插入图片描述

  • 组成一个程序的每个源文件(test.c)通过编译过程分别转换成目标代码(test.obj)
  • 每个目标文件又由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。
  • 链接器同时会引入标准c函数库中任何被该程序所用到的函数。

对于一个源文件(test.c)变成最终的二进制文件(test.exe)可以通过下图简单表示:
在这里插入图片描述
在这里插入图片描述

看上图我们知道:编译又分三步:

  1. 预编译 (预处理)(test.c —>test.i)
    (1)处理所有的注释,以空格代替
    (2)将所有的#define删除,并展开所有的宏定义
    (3)处理条件编译指令#if、#ifdef、#elif、#else、#endif
    (4)处理#include,展开被包含的文件
    (5)保留编译器需要使用的#pragma指令
  2. 编译 (test.i —>test.s)
    (1)把C语言代码编译成汇编代码
    (2)进行语法分析,词法分析,语义分析,符号汇总形成符号表
  3. 汇编 (test.s —>test.o)
    汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每个C语言源程序,都将最终经过这一处理而得到相应的目标文件。 目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

编译完后执行链接,链接会做哪些事呢?

  1. 合并段表
  2. 符号表的合并和符号表的重定位
  3. 最后形成(test.exe)

二、程序的运行环境

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值