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
控制格式,已达到美观。
运行结果
升级后的结果
代码链接
相关参考资料
20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod的更多相关文章
- 20155320信息安全系统设计第二周课堂考试总结及myod的实现
20155320 信息安全系统设计第二周课堂考试总结及myod的实现 第二周测试一二已在课上提交 第二周测试3-gdb测试 用gcc -g编译vi输入的代码 在main函数中设置一个行断点 在main ...
- 20155319 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile、myod
20155319 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile.myod 测试2-gcc测试 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码 2.生 ...
- 20145209刘一阳《JAVA程序设计》第四周课堂测试
第四周课堂测试 1.下列说法正确的是(ACD) A .使用extends关键字定义一个类的子类. B .Java与C++类似,支持多继承,即子类可以有一个或多个父类. C .Object是所有类的祖先 ...
- 20155339 《信息安全系统设计》第十周课下作业-IPC
20155339 <信息安全系统设计>第十周课下作业-IPC 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在该进程的 ...
- 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现
20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...
- 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计
2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...
- 2018工业信息安全技能大赛华东赛区初赛 第2题 writeup
2018工业信息安全技能大赛华东赛区初赛 第2题 解题思路 本题主要考察点是对常见工控协议的理解(modbus/tcp和s7comm),题目目标是寻找出报文中某条异常报文流量.很让人疑惑的是,题目中并 ...
- 20155321 《信息安全系统设计》课堂测试(ch06)
20155321 <信息安全系统设计>课堂测试(ch06) (单选题|1分)下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A .1 B .1/4 C . ...
- MyEclips 2017/2018 (mac 版)安装与破解
MyEclips 2017/2018 (mac 版)安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEclips ...
随机推荐
- window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)
linux下基本没什么问题,但在window操作系统下比较麻烦. 需要添加环境变量path路径:C:\Program Files (x86)\PostgreSQL\9.3\bin 添加postgres ...
- [19/04/20-星期六] Java的动态性_字节码操作(Javassist类库(jar包),assist:帮助、援助)
一.概念 [基本] /** * */ package cn.sxt.jvm; import javassist.ClassPool; import javassist.CtClass; import ...
- 【bbs】login.php
require的路径 整体结构的复用 渐变效果的加入 按钮:实现背景透明,文字不透明:在background-color中使用rgba,标准浏览器中,背景透明,文字不透明background-colo ...
- IIs和ftp
简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件.若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文 ...
- virtualbox+vagrant学习-2(command cli)-1-vagrant box命令
vagrant box 这是用于管理(添加.删除等)boxes的命令. box 是一个打包好的操作系统,是一个后缀名为 .box 的文件,其实是一个压缩包,里面包含了 Vagrant 的配置信息和 V ...
- Spring(六)之自动装配
一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者 ...
- Mybatis Plus启动注入 SQL 原理分析
1) 问题: xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, ...
- CSS3中为什么要清除浮动以及三种清除浮动(float)的方法
方法一:添加新的元素 .应用 clear:both .clear{ clear:both; height: 0; height: 0; overflow:hidden; } 方法二:父级div定义 o ...
- Gradle Goodness: Excluding Tasks for Execution
In Gradle we can create dependencies between tasks. But we can also exclude certain tasks from those ...
- 【HTML5-基础-SVG实践】
关于svg HTML页面常用加载svg图片方式: HTML元素 // data 和 type 至少指定一项 <object data = './public/icon.svg' width='2 ...