20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod

20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod

测试1-vi

  1. 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
  2. 用Vi输入图中代码,并用gcc编译通过
  3. 在Vi中使用K查找printf的帮助文档
  4. 提交vi编辑过程截图,要全屏,包含自己的学号信息

运行结果

出现的问题:

  • 出现了很多warning,上图有体现,虽然可以运行,但看着比较不舒服,课堂上就一直在修改,以至于没能完成后面的测试。
  • 解决:课后长时间再次研究,发现是代码问题,head中的与我所命名的函数名称有所出入,因此虽然能编译,但是出现了许多warning,修改以后终于没有warning了,如下图

测试2-gcc测试

  1. 用gcc 进行预处理,编译,汇编,链接vi输入的代码
  2. 生成的可执行文件中要有自己的学号
  3. 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息

运行结果

测试3-gdb测试

  1. 用gcc -g编译vi输入的代码
  2. 在main函数中设置一个行断点
  3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
  4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

步骤

  • 编译可执行文件,由于会生成默认的输出文件,所以除非需要自定义一般的编译命令gcc -g xxx.c,需要调试代码前用gcc编译时一定要加-g参数,只有加了-g参数,才可以进行调试。
  • 启动gdb:gdb xxx
  • 在main函数设置断点:b main
  • 运行:这里包括运行程序:r单步执行:ns继续执行c

GDB常用命令

运行结果

测试4-静态库的测试

  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
  2. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
  • 创建静态库,需要用到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-共享库

  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
  2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
  • 动态库的生成和调用
    若要生成一个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

  1. 复习c文件处理内容

  2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

  3. main与其他分开,制作静态库和动态库

  4. 编写Makefile

  5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

编译思路以及步骤

  • 首先,复习了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控制格式,已达到美观。

运行结果


升级后的结果

代码链接

相关参考资料

posted @ 2017-10-01 15:11  20155339平措卓玛  阅读(353)  评论(3编辑  收藏  举报