20145201 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
vim学习使用
vim的几种模式:
1.普通模式
Vim的普通模式用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。
Vim强大的编辑能来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令dd删除当前行,但是第一个"d"的后面可以跟另外的移动命令来代替第二个d,比如用移动到下一行的"j"键就可以删除当前行和下一行。另外还可以指定命令重复次数,2dd(重复dd两次),和dj的效果是一样的。 -=普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。=-2.插入模式
在这个模式中,大多数按键都会向文本缓冲中插入文本。
-=插入模式中回到普通模式:ESC键。=-3.可视模式
与普通模式类似,但移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。
4.选择模式
这个模式中,可以用鼠标或者光标键高亮选择文本。
如果输入任何字符,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
5.命令行模式
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。
在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
-= 命令行模式进入普通模式:Esc 或 Ctrl + [ =-6.Ex模式
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。
小结:
三种常用模式(普通模式、插入模式和命令行模式)的切换:- 普通换插入: i 或 a
- 插入换普通: Esc 或 Ctrl + [
- 普通换命令行: :
- 命令行换普通:Esc 或 Ctrl + [ 命令行模式下输入wq ,回车后保存并退出。
游标移动
普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
按键 说明
h 左 l 右(小写L) j 下 k 上 w 移动到下一个单词 b 移动到上一个单词 在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入命令 说明
i 在当前光标处进行编辑 I 在行首插入 A 在行末插入 a 在光标后插入编辑 o 在当前行后插入一个新行 O 在当前行前插入一个新行 cw 替换从光标所在位置后到一个单词结尾的字符 从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下退出vim
1.命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
以下为其它几种退出方式:
:q! 强制退出,不保存
:q 退出 :wq! 强制保存并退出 :w 另存为 :saveas 文件路径 另存为 :x 保存并退出 :wq 保存并退出 2.普通模式下退出vim普通模式下输入Shift+zz即可保存退出vim
删除文本
普通模式下删除vim文本信息
进入普通模式,使用下列命令可以进行文本快速删除:
x 删除游标所在的字符
X 删除游标所在前一个字符 Delete 同x dd 删除整行 dw 删除一个单词(不适用中文) d$或D 删除至行尾 d^ 删除至行首 dG 删除到文档结尾处 d1G 删至文档首部复制粘贴和剪切
1.复制及粘贴文本(普通模式中)
1) 复制——y
yy复制游标所在的整行(3yy表示复制3行)
y^ 复制至行首,或y0。不含光标所在处字符。 y$ 复制至行尾。含光所在处字符。 yw 复制一个单词。 y2w 复制两个单词。 yG 复制至文本末。 y1G 复制至文本开头。 2) 粘贴——pp(小写)代表粘贴至光标后(下)
P(大写)代表粘贴至光标前(上) 2.剪切及粘贴dd删除命令就是剪切,剪切后就可以使用p来粘贴。
按下tab键可以补全文件名。
大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。
gcc
gcc 支持编译的一些源文件后缀名:
- gcc编译文件的流程:
我们可以把编译过程分成四步,以编译hello.c生成可执行文件hello为例,如下图:
1)预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
首先gcc会调用预处理程序cpp,由它负责展开在源程序中定义的宏(上例:#include <stdio.h>),向其中插入#include语句所包含的内容(原地展开stdio.h包含的代码) 其中:.i后缀 hello.i这是一个经过预处理器处理之后的C源文件 gcc的-E参数可以让gcc在预处理结束后停止编译过程。2)编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
将hello.i编译为目标代码,gcc默认将.i文件看成是预处理后的C语言源代码,因此它会直接跳过预处理,开始编译过程。 Tips:①gcc预处理源文件的时候(第一步),不会进行语法错误的检查 ②语法检查会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误......3)汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
汇编阶段是把编译阶段生成的“.s”文件转成目标文件,在此使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。4)链 接:gcc hello.o –o hello ;gcc -o 调用ld
gcc连接器将目标文件链接为一个可执行文件,一个大致的编译流程结束 编译过程比较难记,可以简化一下,前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”。注意:
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out在命令行上运行这个可执行目标文件需要输入它的名字:
./a.out
用gcc编译一个c程序
gcc 选项列表
1)gcc常用选项
-c 只编译不链接,生成目标文件.o-S 只编译不汇编,生成汇编代码-E 只进行预编译,不做其他处理-g 在可执行程序中包含标准调试信息-o file 将file文件指定为输出文件-v 打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir 在头文件的搜索路径列表中添加dir目录
2)库选项
-static 进行静态编译,即链接静态库,禁止使用动态库-shared 1.可以生成动态库文件 2.进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库-L dir 在库文件的搜索路径列表中添加dir目录-lname 链接称为libname.a或者libname.so的库文件。 如果两个库文件都存在,根据编译方式是static还是shared进行链接-fPIC 生成使用相对地址的位置无关的目标代码,(-fpic) 然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。
-静态库
(1)静态链接
像Unix ld程序这样的静态链接器,以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
为了构造可执行文件,链接器必须完成两个主要任务:
符号解析
重定位 目标文件纯粹是字节块的集合,链接器将这些块链接起来,确定被连接块的运行时位置,并且修改代码和数据块中的各种位置。(2)静态库
所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,可以作为链接器的输入。当链接器构造一个输出的可执行文件时,它只拷贝静态库里被应用程序引用的目标模块。
在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。存档文件由后缀.a识别。
gdb
一般来说,gdb主要帮忙用户完成下面4个方面的功能:
1.启动程序,可以按照用户自定义的要求随心所欲的运行程序。
2.可让被调试的程序在用户所指定的调试的断点处停住 (断点可以是条件表达式)。 3.当程序停住时,可以检查此时程序中所发生的事。 4.动态地改变程序的执行环境。 从上面来看,gdb和一般的调试工具区别不大,基本上也是完成这些功能,不过在细节上,会发现gdb这个调试工具的强大。大家可能习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。注意使用GCC编译时要加“-g”参数。
GDB最基本的命令有:
- gdb programm(启动GDB)
- b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
- run 开始运行程序
- bt 打印函数调用堆栈
- p 查看变量值
- c 从当前断点继续运行到下一个断点
- n 单步运行
- s 单步运行
- quit 退出GDB
四种断点:
1.行断点 b [行数或函数名] 2.函数断点 b [函数名] 3.条件断点 b [行数或函数名] 4.临时断点 tbreak [行数或函数名]Make和Makefile
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。
而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
最终实现——自动化编译
如何进入Makefile?
$ vim Makefile1.Makefile 基本规则
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
格式为:
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令) ....... 即: target: dependency_files command 2.使用带宏的 MakefileMakefile中的宏,也称作变量。
变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。
在Makefile中定义宏的格式为:
macroname = macrotext
使用宏的格式为:$(macroname)
练习
使用vim 输入以下代码,联系使用“K”查找帮助文档:
3.练习gcc编译运行代码;
4.练习gdb调试代码;
5.把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so;
6.编写makefile,让代码编译,上述静态库和共享库的使用自动化。
教材学习中的问题和解决过程
问题:GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,那么实际使用中应该优先选用哪个?为什么?
答:我认为应该优先选用n命令。因为n命令它直接是函数的结果,如果正确就继续向下运行,如果不正确说明函数内部有问题,需要用step进入函数检查。
代码调试中的问题和解决过程
关于gcc部分
用Gvim编辑代码时,储存文件名为hello,不能在Xfce终端里正常运行代码。 解决:需要将文件名直接保存为hello.c。后缀.c为C语言源文件。本周代码托管截图
其他(感悟、思考等,可选)
本周学习了熟悉vi的基本操作,gcc编译器的使用,gdb调试技术等内容。虽然在vim学习中,第一次需要张我大量的常用按键,但掌握之后发现这些都是非常方便的功能,减去了不必要的麻烦。通过学习本周学习内容发现,老师所给的所有学习资料都是非常有用的,是互补的关系,要充分利用这些教学资源,不断提高自学能力,对以后的学习帮助很大。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 100/100 | 2/2 | 25/25 | |
第二周 | 100/200 | 1/3 | 30/55 |
参考资料
- ...