2019-2020-1 20175328 信息安全系统设计基础
第一周学习总结
一、学习内容
1、熟悉Linux系统下的开发环境
2、熟悉vi的基本操作
vi编辑器是Linux系统下标准的编辑器。
vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode):
- 命令行模式
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。 - 插入模式
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。 - 底行模式
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。 不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
用"vi filename"命令进入vi命令行模式。如果要想编辑文本文件,必须要转换到插入模式下,也就是按一下键盘上的"i",这样就可以对文本内容进行编辑。按键盘上的上下左右键,光标可以来回移动。
如果想退出文本编辑模式,并且保存刚刚编辑的文本,首先点击一下键盘上的"ESC",然后输入":wq!"这样文本就保存了。如果不想保存就按一下键盘上的"ESC",输入":q!"。如果不确定保存是否成功,可以通过"cat filename" 命令来查看。
光标的移动除了键盘上的上下左右键,也可以是小写模式下,键盘上的"h,j,k,l"
"ctrl+b":屏幕往后移动一页
"ctrl+f":屏幕往前移动一页
"ctrl+u":屏幕往后移动半页
"ctrl+d":屏幕往前移动半页
输入任何一个整数,然后输入"shift+G" 就可以到这一页的开头了.
大写"G":移动到文章的最后
"$":将光标移动到行尾
"^":将光标移到行头
"w":将光标移到下一行头
"b":跟"w"相反.移到上一行行头
"e":将光标移到下一行尾.
文本显示行号:在命令行模式下,在文本最后输入":set nu"命令
复制:
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
查找:
用"/"加上要查找的内容.例如"/hello"或者是"?hello"也是可以的.
替换:
「r」:替换光标所在处的字符。按一下"r"然后输入要替换的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
恢复上一次操作:
「u」:如果误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次恢复,就相当于"CTRL +Z"的操作.
3、熟悉gcc编译器的基本原理
命令格式:gcc [选项] [文件名] -E:仅执行编译预处理
-S:将C代码转换为汇编代码
-c:仅执行编译操作,不进行连接操作
-o:指定生成的输出文件
-I(大写i):指定头文件目录
-l :指定程序要链接的库
-L:指定库文件所在的目录名
使用gcc编译工具由c语言源程序生成可执行文件的过程并不单单是一个编译的过程,而要经过四个过程:
1)预处理:调用cpp、使用的参数为e; 2)编译:调用ccl,使用的参数为s; 3)汇编:调用as,使用的参数为c; 4)链接:调用ld,生成可执行程序。
4、熟练使用gcc编译器的常用选项
直接输入gcc hello.c -o hello 可以完成编译,这一步操作可以分成以下四步进行:
1)将hello.c预处理输出hello.i文件:gcc -E hello.c -o hello.i(文本文件)
可以通过vim来查看.i文件的内容
2)将预处理输出文件hello.i汇编成hello.s文件:gcc -S hello.i -o hello.s(文本文件)
可以通过vim来查看.s文件的内容
3)将汇编输出文件hello.s编译输出hello.o文件:gcc -c hello.s -o hello.o(二进制文件)
可以使用objdump -d命令反汇编查看文件。
4)将编译输出文件hello.o链接成最终可执行文件hello:gcc hello.o -o hello
当多个文件一起编译时,有两种编译方法(第一种方法编译时需要所有文件重新编译,第二种只重新编译修改的文件,未修改的不用重新编译):
1)一起编译
gcc test_a.c test_b.c -o test 或 gcc *.c –o test
2)分别编译各个源文件后对编译输出的目标文件链接
gcc -c test_a.c //生成test_a.o
gcc -c test_b.c //生成test_b.
gcc -o test_a.o test_b.o -o test
使用vim编辑相应代码,注意.h文件应放入include中, .c文件应放入src中。代码有一个head.h文件,里面包括了对加减乘除四个函数的定义,接着是四个加减乘除函数,最后是main函数,通过调用加减乘除函数来显示计算结果。
输入 gcc *c (一起编译所有.c文件)-o main:
会发生错误:找不到head.h的头文件,原因是head.h被放到了另外一个文件夹中,所以编译器在当前文件夹找不到它。
输入 gcc -I/头文件所在路径 *.c -o main:在编译时使用-i来指定头文件所在的路径,可以编译成功。
5、熟练使用gdb调试技术
gdb调试的是可执行文件,而不是源程序
- 使用-g编译选项的gcc命令来编译源程序
- 如:gcc -g test.c -o test
- 通过gdb test来启动gdb
1)help(列出了gdb命令的种类)
2)help all(查看所有的命令)
3)help
4)help
6、熟悉makefile基本原理及语法规范
makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,并且按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个 Shell脚本一样,其中也可以执行操作系统的命令。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
7、掌握静态库和动态库的生成与调用方法
静态库(执行main可以调用静态库):
1)输入“gcc -c -I/头文件所在路径 add.c sub.c mul.c div.c”生成.o文件
2)输入“ar rcvs libmath.a add.o sub.o mul.o div.o”生成静态库
3)输入“gcc main.c -o main -I/头文件所在路径 -L. –lmath”生成可执行文件main
注:
- -l参数用来指定程序要链接的库,-l参数紧接着就是库名。
- -L参数跟着的是库文件所在的目录名。
- gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
动态库:
1)输入“gcc -fPIC -c -I/头文件所在路径 add.c sub.c mul.c div.c”生成.o文件
2)输入“gcc -shared -o libmath.so add.o sub.o mul.o div.o”生成动态库
3)将文件libmath.so复制到目录/usr/lib中后,再输入“gcc main.c -o main -I/头文件所在路径 -L. lmath”生成可执行文件main
8、理解C程序中模块的概仿,模块分解的“高内聚,低耦合”的原则
9、了解链接的概念
链接(Link)其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器(Linker)。