Linux预处理、编译、汇编、链接和运行的过程(包括一些基本的命令)

一、预编译 

1.将所有的#define删除,并展开所有的宏定义; 

2.处理所有的预编译指令,例如:#if,#elif,#else,#endif; 

3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置; 

4.添加行号信息文件名信息,便于调试; 

5.删除所有的注释:// /**/; 

6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。 

生成.i文件。

包括(1)去注释 (2)宏替换 (3)头文件展开 (4)条件编译

二、编译:C语言——》汇编

1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;

2.生成汇编代码;

3.汇总符号; 

4.生成.s文件

三、汇编:汇编——》二进制 

1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;

2.合并各个section,合并符号表; 

3.生成.o文件

四、链接

1.合并各个.obj文件的section,合并符号表,进行符号解析; 

2.符号地址重定位; 

3.生成可执行文件



在这里呢,以一个程序为例:

首先呢,我们用mkdir创建一个目录;

ls查看当前目录下的文件信息




然后呢cd命令进入这各目录,touchfile是建立一个文件,这里呢只是说一下mkdir和touch的区别。

紧接着我们进入正题:vim test.c建立一个文件



打开一个文本编辑器,这里呢我已经配置好了vim,所以开头有一些多出来的信息;

在这里先说一下vim的四种模式:

命令模式
插入模式
底行模式
替换模式


命令模式:
进入:其他模式都可以直接转换到命令模式,按Esc即可。如果一次不行就多按几次。
主要用来浏览和操作文件,可以使用相关的快捷键,例如:
gg:跳到文件首
shitf + g:跳到行文件尾
yy: 复制光标所在的一行
yny:复制光标处起的n行
p:粘贴


插入模式:
进入:按Esc进入命令常模式,然后:
按 i 在光标前插入
按 I 在行首插入
按 a 在光标后插入
按 s 删除光标所在的字符再插入
按 A 在行末插入
按 o 在当前行之下新建行
按 O 在当前行之上新建行
按 S 删除光标所在行再插入
插入模式就是用来修改文件内容的。


底行模式:

底行模式则多用于操作文本文件(而不是操作文本文件的内容),例如保存文件"shift+;";或者用来改变编辑器本身的状态,例如设定多栏窗口、标签或者退出编辑器……


替换模式:

替换模式相当于高亮选取文本后的普通模式。在命令模式按下v, V, +v,可以进入可视模式。


vim test.c以后打开我们的命令模式,按i我们进入插入模式,然后编辑文本

编辑好以后shift + ;,进入底行模式,输入wq保存退出,只输入q是退出并不保存



紧接着我们gcc test.c编译文件,会产生一个a.out的可执行程序,然后./a.out。

此时此刻,我们就可以看到这个程序的结果已经输出来了。




接下来我们看看在Linux下它是怎么实现的

第一步:预处理

为了说明问题,我们这里用到了rm a.out先把可执行程序删掉(rm -f表示强制删除文件或目录)

gcc test.c -E -o test.i

表示让gcc只进行“预处理”就行了。 所谓的预处理,就是把程序中的宏展开, 把头文件的内容展开包含进来等等一些编译前的预处理操作,然后-o保存在test.i里。

vim test.i打开以后如下面第二个图,可以看到文件中有861行。






第二步:编译

gcc test.c -S-o test.i

表示让gcc只进行“预处理编译”就行了。将test.i翻译成文本文件test.s,它包含一个汇编语言程序。编译会从词法、语法和语义上对文件进行分析, 并进行汇编代码生成, 形成的还是文本文件------汇编语言文件。以.s作为文件扩展名,然后-o保存在test.s里。






第三步:汇编

gcc test.s -c-o test.o

表示让gcc只进行“预处理编译汇编”就行了。汇编器将test.s翻译成二进制机器语言指令,所以我们就看不懂了,把这些指令打包成一种叫做可重定位目标程序格式,并保存在.o文件中。



第四步:链接

gcc test.o -o a.out
表示让gcc只进行“预处理编译汇编链接”。最后将二进制机器语言指令转换成二进制的可执行程序。

第五步:运行

我们只要./a.out就可以运行了


好了,到这里我们就会很清楚的明白Linux预处理、编译、汇编、链接和运行的全过程。

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值