20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod
20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod
测试1-vi
- 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
- 用Vi输入图中代码,并用gcc编译通过
- 在Vi中使用K查找printf的帮助文档
- 提交vi编辑过程截图,要全屏,包含自己的学号信息
运行结果
出现的问题:
- 出现了很多warning,上图有体现,虽然可以运行,但看着比较不舒服,课堂上就一直在修改,以至于没能完成后面的测试。
- 解决:课后长时间再次研究,发现是代码问题,head中的与我所命名的函数名称有所出入,因此虽然能编译,但是出现了许多warning,修改以后终于没有warning了,如下图
测试2-gcc测试
- 用gcc 进行预处理,编译,汇编,链接vi输入的代码
- 生成的可执行文件中要有自己的学号
- 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
运行结果
测试3-gdb测试
- 用gcc -g编译vi输入的代码
- 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
步骤
- 编译可执行文件,由于会生成默认的输出文件,所以除非需要自定义一般的编译命令
gcc -g xxx.c
,需要调试代码前用gcc编译时一定要加-g
参数,只有加了-g
参数,才可以进行调试。 - 启动gdb:
gdb xxx
。 - 在main函数设置断点:
b main
- 运行:这里包括运行程序:
r
单步执行:n
或s
继续执行c
GDB常用命令
运行结果
测试4-静态库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
- 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
- 创建静态库,需要用到AR工具,命令如下:
gcc -c xxx.c xxx2.c
ar rcs xxxxx.a xxx.o xxx2.o
其中后缀.a的文件是存档文件,是静态库,由多个.o合在一起组成。 - 静态库的使用:比如要测试test.c,则
gcc -c test.c
gcc -static -o prog test.o ./xxxxx.a
其中static
参数告诉编译器驱动程序,链接器应该构成一个完全链接的可执行目标文件,prog是自定义的输出文件夹,./是指在当前路径下的xxxxx.a静态库,如果不是当前路径下的静态库,可加上路径。
运行结果
测试5-共享库
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
- 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
- 动态库的生成和调用
若要生成一个mytest.so的动态库,给出如下指令
gcc -shared -fpic -o mytest.so xx.c xx.c
- 动态库的链接
gcc -o prog main.c ./mytest.so
运行结果
测试6-Makefile
1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.
2 提交Make过程截图,要全屏,包含自己的学号信息
- 刚开始看到这个题目,是完全不知所措的,因为不知道什么是Makefile,然后在网上进行搜索,并且学习,相关链接在后面已经给出,其中包括一个ppt,内容比较全。
学习了之后才知道,之所以不知道makefile是因为之前在sWindows的IDE都为我们做了这个工作,makefile关系到了整个工程的编译规则,在makefile中你可以定义一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,或者说哪些文件需要怎么编译。只需要一个make
命令,所有工程就完全自动编译。 - Makefile的规则:
target ... : prerequisites ...
command
其中target是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签。prerequisites就是,要生成那个target所需要的文件或是目标,command就是make时需要make来执行的命令。 - 代码举例,如下图
运行结果
遇到的问题
- 上图所示的问题,停止。
- 解决方案,继续查看相关文档,知道了一个规则可以有多个命令行,但是需要注意的是每个命令行必须以[tab]开头。尤为重要!它的作用是告诉make这是一个命令行。
myod
-
复习c文件处理内容
-
编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
-
main与其他分开,制作静态库和动态库
-
编写Makefile
-
提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
编译思路以及步骤
-
首先,复习了c语言中关于文件的内容,再回顾了一下Myod命令,此处对于今天需要编写的内容为例,
-t
之后指定输出的进制,可以包括:a、c、d、f、o、u以及x。此处的x是指十六进制,-tx1
则是按一个字符逐个输出,以此类推,od -tx -tc XXX
是在输出十六进制ascii码的同时输出原文本。在Linux中对od -tx1 -tc XXX
进行了尝试,其他也是换汤不换药,所以代码也是对od -tx -tc XXX
进行了代码的编写。在Linux下的结果,如下图:
-
其次,大概的思路就是主函数读取和关闭文件,一个od.c函数来按要求输出,观察上图,可知道一行为16个字符,因此可知循环控制条件为16。
-
编译并修改,上面的思路是可以的,但是在静态库以及动态库中,这个静态库和动态库的建立就没有太大意义,且程序利用率不高,因此进行了升级,将od.c分为两个函数,一个负责-tx1的功能,一个负责-tc的功能,并且进行库的建立,提高了程序的利用率,节约了空间。
-
库的建立以及makefile的编写,与上面所述基本一致,除了函数名称的改变。
遇到的问题
- 问题一:程序进入了死循环
- 解决:修改了多次不知道是不是文件的读取不对,最后重新按数据块进行了读取,重新编译了代码,解决了进入死循环的问题。
- 问题二:控制一行的输出
- 解决:通过判断文件是否读完即a[i]=='\0'是否成立以及i是否等于15来判断,来决定是否进入下一个函数,输入另一行的内容。
- 问题三:仍然输出超过了16个
- 解决:查看代码发现输出'\n'的条件是i==15,这就存在一个问题,如果文本已经读取完毕了了这种情况,所以对此处进行了重新编写。
- 问题四:行号没有编辑
- 解决:观察行号,得出行号有7个字符,并且符合
printf("%07o",16*j);
,所以在ascii.c函数中增加这样一个输出,在hex.c增加一个空格的输出,已达到格式的统一。 - 问题五:用tab键分开太大,与Linux下的od命令所得差距颇大。
- 解决:利用了
%4x
控制格式,已达到美观。
运行结果
升级后的结果