0
点赞
收藏
分享

微信扫一扫

CSAPP Hello程序

笙烛 2022-01-13 阅读 79

对hello.c程序生命周期的理解

先在Documents创建一个文件先在Documents创建一个文件
就叫做csapp
就叫做csapp
并在里面再建一个文件夹hello_world并在里面再建一个文件夹hello_world
接下来就打开命令行,点击 New Terminal点击 New Terminal
安装vim这个c语言编辑器,一般linux系统就自带了,可以升级一下,这里提示是最新版本,就不用管了。然后进入我们刚刚创建的那个文件夹,创建 hello.c
在这里插入图片描述
在hello.c里面写如下代码在这里插入图片描述
然后,退出来,对源代码进行编译,生成可执行文件hello
在这里插入图片描述
这种编译可以分成四个阶段,如下图:
在这里插入图片描述
第一阶段:预处理会根据以#开头的代码,来修改原始程序,例如hello程序中引入了头文件——stdio.h,预处理器会读取该文件中的内容。将其中的内容直接插入到源程序中,结果就得到了另外一个C程序。这个经过预处理器处理后得到的文件通常以 .i 结尾。**这个hello.c 经过预处理器处理后得到了hello.i,这个hello.i仍旧是一个文本文件。
**
第二阶段:编译器将hello.i文件翻译成hello.s文件,这一阶段包括词法分析,语法分析,语义分析。中间代码生成以及优化等一系列中间操作。hello.i经过编译得到hello.s。
第三阶段:汇编器根据指令集将汇编程序 hello.s 翻译成机器指令。并且把这一系列的机器指令按照固定的规则进行打包,得到可重定位目标文件hello.o。此时的hello.o虽然是一个二进制文件,但是还不能执行。
最后一个阶段:链接,在hello这个程序中,我们调用了printf这个函数,这个函数是标准C库中的一个函数,每一个C语言的编译器都会提供,它会将这行代码翻译为计算机可以理解的指令,这个printf函数是在名为printf.o的文件中,这个文件是一个提前编译好的目标文件,链接器负责把hello.o和printf.o根据一定的规则进行合并。正是因为链接器要对hello.o和printf.o进行调整,故hello.o被称为可重定位目标文件,最终经过链接阶段可以得到可执行目标文件——hello。此时得到的hello就可以被加载到内存中执行了。

为什么要理解这个从源码到可执行文件的过程?
1.优化程序性能
(1)一个switch语句是不是要比一连串的if-else要高效的多。
(2)一个函数调用的开销有多大
(3)while循环比for循环更高效
2.理解链接时出现的错误
(1)涉及各种函数库的调用时的报错
(2)静态变量和全局变量的区别
(3)静态库和动态库的区别
(4)有一些链接库的错误,一直到运行的时候才出现。
3.避免安全露铜
理解数据和控制信息在程序栈上如何存储

举报

相关推荐

0 条评论