20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现

第二周课堂测验:

(注:前两项在课堂已提交,在此不做详解)

第一项:

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

第二项:

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

第三项:

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

关于GDB常用命令:

  • 安装:
sudo apt-get install gdb  

  • 源文件的某一行设置断点
break 行号
  • 一个特定的函数设置断点
break 函数名
  • break 函数名 (break可简写为 b)
break 行号 if 条件
  • 运行跳转到断点
run
  • 观察变量,如果变量的值发生变化,程序就会停止
watch b
  • 看变量的值或则单个变量的值,可以控制输出的格式
p i; 例如:输出八进制数:p/o i
  • 进入函数内部
s
  • 单步调试
n
  • 继续运行程序
continue
  • 自动显示一些变量
display
  • 退出gdb
q
  • 删除断点
delete 行号

第四项:

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

步骤:

1.无论静态库,还是动态库,都是由.o文件创建的。首先将源程序.c通过gcc先编译成.o文件。

gcc -c add.c -o add.o
gcc -c sub.c -o sub.o
gcc -c mul.c -o mul.o
gcc -c div.c -o div.o

2.由.o文件创建静态库.静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。

ar rcs mymath.a add .o sub.o mul.o div.o

3.用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。

gcc -static -o op1 main.o mymath.a

4.运行

./op1

遇到的问题:

1.在按部就班的输入一系列命令后,发现出现错误,如下显示:核心已转储,并且加减乘除结果不正确。

解决:在检查之后,发现main.c没有生成.o

文件,切记所有c文件都需变成o文件,不然无法创建静态库。

第五项:

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

步骤:

1.编译生成共享库

gcc -shared -fpic -o mymath.so add.c sub.c mul.c div.c

2.编译生成可执行文件

gcc -o op mian.c ./mymath.so

3.运行

./op

补充

1.什么是库

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

2.库的种类

linux下的库有两种:静态库和共享库(动态库)。

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

静态库的后缀是 .a

动态库的后缀是 .so

第六项:

1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.

2 提交Make过程截图,要全屏,包含自己的学号信息

简单的说,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译。makefile带来的好处就是——“自动化编译”,感觉就是只需要一个make命令,整个工程完全自动编译。

Makefile的规则

目标 : 需要的条件 (注意冒号两边有空格)

命令 (注意前面用tab键开头!!!

testmymath:add.o sub.o mul.o div.o
cc -o testmymath add.o sub.o mul.o div.o main.o
add.o : add.c head.h
cc -c add.c
sub.o :sub.c head.h
cc -c sub.c
mul.o :mul.c head.h
cc -c mul.c
div.o :div.c head.h
cc -c div.c
main.o :main.c head.h
cc -c main.c
~
~

  

注:需要的条件就是生成目标所需要的文件或目标;命令就是生成目标所需要执行的脚本。

Myod

1 复习c文件处理内容

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

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

  2. 编写Makefile

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

6 在博客园发表一篇博客,重点写遇到的问题和解决过程

步骤:

1.理解od -tx -tc XXX的功能

od命令

通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

语法:od [选项] 文件…

命令中各选项的含义:

  • A 指定地址基数,包括:

    d 十进制

    o 八进制(系统默认值)

    x 十六进制

    n 不打印位移值

  • t 指定数据的显示格式,主要的参数有:

    c ASCII字符或反斜杠序列

    d 有符号十进制数

    f 浮点数

    o 八进制(系统默认值为02)

    u 无符号十进制数

    x 十六进制数

2.三个.c文件

maim.c:文件的读入,判空,以及行号的设置

myod1.c:文本内容的输出

myod2.c:文本内容相应的十六进制ASCII码输出。

遇到的问题:

1.在head.h中,无法像myod1(FILE *f)这样来声明函数,出现如下图这样的提示:

解决:定义一个数组file[1000]="123.txt",再通过fopen打开123.txt。这样在head.h里声明的是char型,就不会有错误提示。

char file[1000]="123.txt";
char c,a[1000]={0};
FILE *f;
int i=0,m,line=0;
f=fopen(file,"r");

2.运行结果出现如下图,文本内容和ASCII出现错位:

解决:在myod1.c中,k=i-16出现错误。16个数一行,k为第一个数的序号,应该只减15。

3.编程时,行号随myod1.c的文本输出而输出。所以当最后一行文本内容结束时,行号也随之结束。但是od命令还有下一行的行号。

解决:在循环结束后,再输出一次line,这样才能多一行行号。

结果

除此之外,包括ASCII码输出时,要先printf一行空格,以保证文本和ASCII码相互对应。空格的个数要不断尝试,才能达到合适。

心得体会

这次任务中,前六个实践相对容易,百度一些资料,大部分是一些需要记忆的命令。但是编写Myod时,感受到自己C语言的薄弱,又重新打开课本,学习关于文件的知识,用了很多时间。虽然这次实验博客接近尾声,但是实践的相关知识还需要好好温习。如果时间允许的话,希望老师可以讲更多的内容,下课再依据上课内容实践,这样学习效果更好,印象更深刻!

参考资料

Makefile的编写

Linux 静态库&动态库调用

静态库的生成和使用

20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现的更多相关文章

  1. 20155320信息安全系统设计第二周课堂考试总结及myod的实现

    20155320 信息安全系统设计第二周课堂考试总结及myod的实现 第二周测试一二已在课上提交 第二周测试3-gdb测试 用gcc -g编译vi输入的代码 在main函数中设置一个行断点 在main ...

  2. 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD

    20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...

  3. 20145209刘一阳《JAVA程序设计》第二周课堂测试

    第二周课堂测试 1.if关键字后面的小括号内,表达式的值可以为10.(B) A .true B .false 2.表达式0xaa | 0x55的值为(C) A .FF B .0 C .255 D .1 ...

  4. # 第二周课堂实践以及MyOD

    第二周课堂实践以及MyOD 之前使用的虚拟机出现问题被我删掉了,开始学着使用Mac系统自带的终端.在课堂上出现了问题,询问王雄老师也没有解决,课下先使用了实验楼环境进行实验,后来又在Mac重新进行了尝 ...

  5. 20155233刘高乐 第二周课堂实践以及MyOD

    1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so? 2. 提交共 ...

  6. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  7. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

    20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...

  8. 20175316盛茂淞 《java程序设计》第三周课堂测试错题总结

    20175316盛茂淞 <java程序设计>第三周课堂测试错题总结 出现问题 错题总结 题目1 在Ubuntu中用自己的有位学号建一个文件,教材p87 Example4_15 1. 修改代 ...

  9. 2017-2018-1 20155232 《信息安全系统设计基础》第十周课堂测试(ch06)补交

    # 2017-2018-1 20155232 <信息安全系统设计基础>第十周课堂测试(ch06)补交 上课时完成测试后在提交的时候,没有提交成功,进行补交. 1.下面代码中,对数组x填充后 ...

随机推荐

  1. Excle巧取汉字打头的字串内容

    处理表格数据时遇到问题:从网页表格中复制来的数据,地址一列中出现类似于“4AWZCX万载老林业局2”的无用字符前缀.现在希望提取第一个汉字及其之后的所有内容(图1),寻求高效分离中英文及数字的实操方法 ...

  2. es6学习笔记--let和const

    今天学习了es6中的let和const命令,借此整理一下笔记. let : let 和 var 的声明方式一样,但有 var 比不上的优点.下面用 var 和 let 的例子来加深对 let 的理解. ...

  3. 【NOIP2016】蚯蚓(队列,单调性)

    题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...

  4. [BZOJ1046] [HAOI2007] 上升序列 (dp)

    Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...

  5. 【Android】[Problem]-"Waiting for target device to come online".

    环境: win10专业版(创意者),Android studio 2.3.1 问题描述: 安装玩Android studio之后创建一个项目,建立AVD之后,运行程序时一直不能启动AVD,具体描述为: ...

  6. Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程

    最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id=& ...

  7. linux下debug工具

    在linux下开发难免会遇到bug,但是由于没有图形IDE,导致debug也变得困难,其实只要掌握一些常用的debug工具,一些错误就能很快解决,本文就介绍一些常用的工具用以调试: log 输出log ...

  8. Java NIO FileVisitor 高效删除文件

    在公司项目中,由于做个二维码扫码平台项目,预计每天产生的二维码图片达到十几G,所以要做个定时清理任务来定时清理图片,根据不同场景保留图片,规则是:1.二维码统一登录图片几个小时有效   2.电子名片二 ...

  9. Spark2.1.0官方文档

    Spark 概述 Apache Spark是一个快速和通用的集群计算系统.它提供Java,scala,Python.R语言的APIs,以及支持一般执行图形的优化引擎. 它还支持一组丰富的高级工具,包括 ...

  10. 从循环添加事件谈起对JS闭包的理解

    1.引子 相信很多初学js的人,都遇到这样一种情况:想要给一堆按钮添加各自的事件,比如点击第i个按钮时,弹出i这个值.理所当然地,我们会这样写: var buttons = document.getE ...