(全)2017-9-20 第一次 信息安全系统设计基础课 主要内容
我为什么要把主要内容写下来
我的目的很单纯,一是整理一下笔记,方便考试复习,方便查阅;二是方便其他同学,可以通过我写的主要内容回顾课堂知识;三是让娄老师看到没准能给我加个分。
注意以下三点:
框框内几乎还原了老师的原话,可能有用也可能没用,反正我记下来了,这样你可以基本还原课堂的思路流程。
你读我写的博客就好像是在看我的笔记了,我笔记尽量都记对,但是错了或者不标准的话麻烦指出来啊,私聊我一处错误一元红包(可以不要)。
老师本节课主要讲了三大方面的内容和一些Linux的基本操作指令。
接下来是老师讲的第一个问题:编译和汇编
我们上学期一直在强调同一个概念,就是存储程序,
计算机有两个重要的方面:CPU&内存,
内存可以看做是字节数组,CPU完成的工作是取出内存指令并执行,
老师打开虚拟机中hello.c的文件,然后输入:
od -tc hello.c
,其中,这个od
的作用是查看文件内容,-tc
的功能是用文本方式查看。
c语言的hello.c看上去代码只有这些,但是实际上编译时要做的工作有很多。
怎么查看源代码啊?
老师输入了gcc -E hello.c -o hello.i 编译预处理
这个指令的功能是编译预处理,执行了这个指令之后就会出现我们的源代码,老师让我们看书上的第三页,老师输入:gcc -S hello.i -o hello.s
,就把源代码转换成了汇编代码。
这样我们就把机器语言转换成机器码了,
然后老师输入gcc -c hello.s -o hello.o
,之后又输入vi hello.o
来读取hello.o文件中的文件
怎么样?看到的是一堆乱码吧!这个已经不是我们的文本文件了,要想读取的话应该输入
od -tx hello.o
,这样就可以查看目标文件了,
想由目标码得到汇编码的话,反汇编就好了,就要输入objdump -d hello.o
,这个很重要啊,得记一下,这时候我们再输入ls hello.*
来查找一下当前文件夹里的名字为hello的所有文件,可以看到黑色的就是不可执行的文件,绿色的他已经给你标好了,是可以执行的文件。
大家自学第一章和第七章啊,
看预处理是-E,然后是-S,然后再-c,拼一块就是ESC啊,对应的后缀就是.i、.s、.o,
整理成表格如下:
接下来是老师讲的第二个问题:关于怎样发现错误,怎样调试代码
代码出了问题怎么办?代码哪里有问题?代码出错了怎么调试?其实Java和C语言差不多,
教大家三招命令行指令:
常用的调试技巧有两个,debug(模式)和release(发布),输入
gcc gdb basic.c
即可,但是这样显示出来的参数比较少,没有太多信息,要想看更多的信息的话就在前面加一个-g
。之后输入gdb a.out
。
设置断点有四种断点,一个是行断点,看函数就是函数断点,临时断点,循环时用条件断点,
用(gdb) info b
查看断点,用(gdb) run
就可以运行到断点处,
但是我们最常用的不是gdb,而是cgdb指令,你输入时要是没有这个功能的话Ubuntu会提示你安装的,
以上是基本调试方法,接下来再延伸一个调试方法
gcc -g gdbfuncloop.c
,输入这个进入编译窗口,输入(gdb) b main
设置函数断点,设置行断点(gdb) b 14
,在b后面直接加上行号就行,行号会变成红色。运行时直接输入r就行,r就相当于run,类似的n就相当于next,例如:(gdb) r
,
当你想从一个断点跳到下一个断点时,就要用continue,可以简写为c,
无论是Java还是C语言,都要养成一个好习惯,首先main函数内开头就设置一个断点,防止程序上来就跑飞了,
使用(gdb) print j
可以打印出变量j的值,看看与我们的期望值是否相同,
使用(gdb) s
直接跑进函数里,先看看参数值对不对,直接打印一下看看得多少,
一个函数有很多行,我抽几行运行了一下之后,剩下的就不想一行一行看了,直接运行完就行了,这时候我要使用finish,简写为f即可,
还可以怎么调试?可以给函数赋一个新值,让他往下走,看看得多少,
让要运行10000次的函数一下子运行完,使用until,、
使用next要自己一次一次输入,嫌麻烦吗?用display,只要参数值变了就会给你显示出来,
接下来是第三个问题:编程的注意事项
C语言是面向过程,Java是面向对象的,编程时要注意三点,自顶向下,逐步求精,模块化程序设计,想C语言了里面的
xx.h 和xx.c
文件就是一个模块,
设计模块的原则是:高内聚,低耦合,
我的学生某天找我说有个问题,他的C文件只想给他的导师使用,不想让他的老师看源代码,怎么办?有两个方法:
1.将xx.c做成xx.lib,再和xx.h打包在一块
2.将xx.c做成xx.dll,再和xx.h打包在一块
这个是在windows的叫法,要是在LINUX里就叫xx.o和xx.a,
看第七章,P475讲的是建静态库,P485讲的是动态库,
指令
gcc -c hello.c
生成什么?会生成hello.o文件,阶段编译会把每个模块都编出一个.o出来,有了hello.o以后,就不需要hello.c了,就算我们再把hello.c改成别的名字也不影响以后的程序了,
静态库吧hello.o打包压成hello.s是怎么来的?看P476,用ar rcs
,所有静态库的名字都是libhello.a ,用指令ar rcs libhello.a hello.o
就做好静态库了,从此hello.o文件就没用了,指令gcc main.c -L -lhello
链动态库,等找我验收的时候就用ls全部都列出来,比如改hello的名字时,你要知道链接的是哪个。