C语言程序翻译环境详解

前言

一个源文件想要变成可执行程序要经过两个过程:1.编译 2.链接。这两个过程都是在翻译环境下进行的。今天的主题是带大家了解翻译环境中的执行的具体操作。
在这里插入图片描述

一、编译

后续操作作将在Linux环境下演示。

1.预编译(预处理)

在这里插入图片描述
在Linux下创建一个test.c的文件。

预处理 选项 gcc -E test.c -o test.i
预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
在这里插入图片描述
打开test.i文件
在这里插入图片描述
这里我们会发现原来只有几行代码的test.c经过预处理生成的test.i文件内容居然有800多行之多。
我们不妨对比下test.c 与 test.i的内容
在这里插入图片描述
细心的小伙伴不难发现test.c中的<stdio.h> 和注释在经历过预处理在test.i中消失不见了,
其中<stdio.h>是在test.i中展开,所以导致其内容变的很多。
总结: 1.头文件的包含 2.注释被删除 3.#define符号的替换(上述没有演示,读者可自行实践)

2.编译

编译 选项 gcc -S test.c
编译完成之后就停下来,结果保存在test.s中。
打开test.s
在这里插入图片描述
test.s中全是汇编代码
总结: 编译过程中把C语言代码转变成汇编代码,详细过程1.语法分析2. 词法分析3.语义分析4.符号汇总

3.汇编

汇编 gcc -c test.c
汇编完成之后就停下来,结果保存在test.o中。
打开test.o
在这里插入图片描述
what!,很多读者看到这里或许和我一样吃惊,其实这都是二进制机器指令
总结: 形成符号表。

二、链接

创建add.c文件进行上述类似操作
在这里插入图片描述
生成add.o文件(目标文件,windows中后缀为.obj)
在这里插入图片描述
执行gcc test.o add.o 将两个目标文件进行链接生成可执行程序a.out
在这里插入图片描述
执行a.out
在这里插入图片描述
成功打印数字5。

1.符号汇总

符号汇总出现在编译时期,就是将具有全局性质的符号进行汇总,如:上述test.c中的main , Add.

2.符号表

在这里插入图片描述
符号表作用就是对全局数据如Add 进行重定位。这也是为什么两个不同文件中不声明函数也能够运行的原因。
总结: 1.合并段表 2.重定位

总结

感谢大家的观看,如有错误望指出!

  • 29
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值