(课程链接:【CSAPP-深入理解计算机系统】1-1.计算机系统漫游_哔哩哔哩_bilibili)
(本人是一名大一学生,在努力学习计算机相关知识,注内部分皆是我通过AI所了解的知识点)
Chapter 1. A Tour of Computer System(计算机漫游系统)
一、The Lifetime of Hello Program(hello world程序的生命周期)
1.Create
源代码编写完成之后,保存得到一个后缀为.c的文件——hello.c
2.The Compilation System
接下来通过上方简单的命令即可完成对源代码的编译,生成可执行文件hello
敲完这条命令,按下回车键,刚才我们编写的hello.c经过编译系统(gcc)之后,就可以生成了一个可执行程序——hello
(本人对Linux系统没有详细的了解过,因此用AI对Linux相关知识进行补充,注内皆是对相关资料查询)
注:在Linux系统下使用GCC编译器进行C语言程序编译的一条命令行语句。
1.gcc:是GNU Compiler Collection(GNU编译器套件)的简称,在Linux系统中常用的用于编译C,C++等语言程序的工具将高级语言编写的源程序转化为可执行工具
2.-o hello:-o是gcc的一个选项,用于指定输出文件名,表示将编译后的可执行文件命名为hello,即编译成功后,在当前目录下会生成一个名为hello的可执行文件
3.hello.c:编译的C语言程序文件名,gcc会读取hello.c文件中的代码,对其进行预处理、编译、汇编和链接等一系列操作,终生成前面-o选项指定的指定的可执行文件
上述过程可细分为:
Stage1.预处理器根据以#开头的代码,来修改原始程序
例如,hello程序中引入了头文件——stdio.h
预处理器会读取该头文件中的内容,将其中的内容直接插入到源程序中,得到了另外一个C程序
Stage2.包括词法分析、语法分析、语义分析、中间代码生成、优化等等一系列的中间操作(详细了解可参考《编译原理》)
Stage3.汇编器根据指令集将汇编程序hello.s翻译成机器指令,将一系列机器指令按照固定规则进行打包
Stage4.链接器(ld)负责把hello.o和printf.o进行合并,需要遵循一定规则,ld对hello.o和printf.o进行调整,因此hello.o才会被称为可重定位目标文件,最终通过链接阶段得到可执行目标文件——hello
Q:Why Programmers Need to Understand How Compilation System Work?(为什么要理解编译系统如何工作的?)
1.Optimizing program performance(优化程序性能)
2.Understanding link-time errors(理解链接时出现的内存)
3.Avoiding security holes(避免安全漏洞)
缓冲区溢出(buffer overflow)导致互联网安全漏洞的主要原因
预防(1)理解数据和控制信息在程序栈上如何储存
(2)不严谨、不规范的书写方式的后果
3.Run Hello Program by Shell(如何运行hello的可执行文件)
method:打开shell程序,然后在shell中输入相应可执行程序的文件名
shell程序的介绍:
shell是一个命令解释程序,它输入一个提示符>来等待一个命令行的输入,然后执行这个命令。若该命令的第一个单词不是内置的shell命令,那么shell就会假设这是一个可执行文件的名字,对此文件进行加载并运行。