分享

C语言 预处理-编译-汇编-链接详细讲解

 融水公子 2023-11-14 发布于福建
表白:黑白圣堂血天使,天剑鬼刀阿修罗。 
讲解对象:
/C语言 预处理-编译-汇编-链接详细讲解
作者:融水公子 rsgz
===

C语言 预处理-编译-汇编-链接详细讲解
之前使用编译器 直接一步到位从.c文件得到.exe文件,那么这个转化过程中间经历了那些操作呢?有必要一探究竟

方式1 一步到位
gcc hello.c -o hello.exe

方式2 四步转化
也就是说需要经过四个步骤转换才能得到exe 大家参考一下下面的流程图


一定要注意前面三个步骤 都是有参数的
后面的-o 只是用来重命名的
gcc -E hello.c -o hello.i    // 得到头文件 预处理文件
gcc -S hello.i -o hello.s    // 得到汇编文件
gcc -c hello.s -o hello.o    // 得到目标文件
gcc hello.o -o hello.exe  // 得到可执行文件


四个步骤的特点分析


1 预处理阶段 其实就是做了一个操作,展开一下头文件,将头文件里面的内容显示到当前的页面来 然后加上原来的函数    其次有一个特点就是 这个阶段
不检查语法错误,换句话可以展开任何文件 如果编辑一个abc.txt文档  也能成功导入进去

经过预处理后 会生成这样的hello.i文件  这个文件需要使用UltraEdit编辑器打开查看  查看内容  确实也能展开普通的文档 等于说钻了空子

除了上面的演示  其实这个阶段还会进行下面的操作:

宏定义替换
#include <stdio.h>
#define PI 3.14

int main(void){
    printf("%d\n", PI);
    return 0;
}
预处理一下
gcc -E hello.c -o hello.i -I .    // 得到头文件 预处理文件  -I . 指定头文件位置
打开预处理文件 可以看到 宏替换了  也就是将宏名 替换成 宏 值

替换注释
注释部分预处理文件会变成这样
特点就是注释部分被替换成空行了


展开条件编译
下面的意思就是 如果定义了PI 就打印括号里面的字符串到控制台里面
换句话说如果定义了PI 就打印 没有定义就不打印
# define PI 3.14
#ifdef PI
printf("----------666\n")
#endif
看预处理结果 就知道#ifdef或者#endif都消失了 直接打印了字符串

这个过程即便是有语法错误 只是会好心提示一下 但是仍然会生成预处理文件

2 编译阶段
经过编译后会出现汇编文件  这个文件函数没有那么多几十行 这是C语言出现之前就已经出现的语言了 所有的计算机语言里面最接近底层的语言 

这个过程主要是
1 能判断语法错误 如果你的代码里面少了关键的标点符号  那么编译阶段就会出现error报错,它是一行行的检查语法错误,也是整个编译过程中最耗时的操作
2 如果没有错误的情况下 将C代码翻译成汇编指令  最后得到.s 汇编文件


汇编阶段
汇编阶段会生成.o文件  这是一个二进制文件 人类完全看不懂的存在
本质上也是机器指令 只不过 是机器指令的二进制文件,  但是文本编辑器 里面可以用十六进制显示


链接阶段

这个阶段比较复杂  直接说结论:
1 数据段的合并
2 数据地址的回填
3 库引入

结合上面的所有理解 那么整个程序生成的过程 可以按照下面的流程


===
 
公众号:不浪仙人
谢谢大家的支持!可以点击我的头像,进入我的空间浏览更多文章呢。建议大家360doc[www.360doc.com]注册一个账号登录,里面真的有很多优秀的文章,欢迎大家的到来。
---
';

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多