20155336 2017-2018 1 《信息安全系统设计基础》2017-9-27课堂实践
第一题:vi
- 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
- 用Vi输入图中代码,并用gcc编译通过
- 在Vi中使用K查找printf的帮助文档
提交vi编辑过程截图,要全屏,包含自己的学号信息
说起来很惭愧,第一次接触虚拟机,对很多地方都陌生,正好趁学习这门课程掌握一下虚拟机的基本操作。
首先创建一个文件夹,命名为text1。然后将第一道题的要求都录入进去。录入完毕后,输入gcc *.c
,
发现了错误,然后vi
进入到.c的文件中,修改了错误再次编译一遍,没有错误,然后就输出./a.out
第二题:gcc测试
- 用gcc 进行预处理,编译,汇编,链接vi输入的代码
- 生成的可执行文件中要有自己的学号
提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
第二题,按照第一节课课上记得笔记,在课下自己实践。虽然中间粗心代码出现错误,但是问题不大
第三题:gdb测试
- 用gcc -g编译vi输入的代码
- 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
这道题出现了很多问题,首先下载GDB,然后在设置了条件断点之后,程序调试的时候没有在断点处停下。在空循环中加个打印空行再设置条件断点然后运行就可以了。(中间由于很多次自己都忘记了编译~~~~~导致每次都会显示自己定义的n没有定义。)
第四题:静态库测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
这道题将自己的代码编译为以下形式: 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 然后使用ar创建一个存档文件:ar rcs mymath.a add.o sub.o mul.o div.o 编译的时候再将程序和mymath.a链接起来:gcc -static -o link1 main.o mymath.a 接着运行就可以了!
第五题:共享库
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
创建一个共享文件 gcc -shared -fpic -o mymath.so add.c sub.c mul.c div.c 创建一个可执行的目标文件 gcc -o link2 main.c ./mymath.so 运行即可
Makefile:
1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.
2 提交Make过程截图,要全屏,包含自己的学号信息
首先上网百度了一下makefile 到底是用来做什么的
答:makefile是规则,是编译,连接等的规则,是对整个工程进行编译、连接的规则。
自我理解就是在执行make之前,需要命名一个Makefile的特殊文件,告诉它需要完成什么任务,该怎么做,在文件里输入自己想要偷懒的地方,然后设置完之后,
make一下就可以了!
Myod:
1 复习c文件处理内容
2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
main与其他分开,制作静态库和动态库
编写Makefile
5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
od -tx -tc的功能:就是在十六进制输出其ascii值的同时,显示对应的文件内容
代码:
#include"head.h"
void main(int argc,char *argv[])
{
char ch[16];
int a,j,i,x = 0;
int in=open(argv[1],O_RDONLY,0);
printf("%07o",0);
printf(" ");
while((a=read(in,ch,16))!=0)
{x++;
for(i=0;i<a;i++)
if(!iscntrl(ch[i]))
printf("%4x",ch[i]);
printf("\n");
printf(" ");
for(j=0;j<a;j++)
if(!iscntrl(ch[j]))
printf("%4c",ch[j]);
printf("%07o",16*(x-1)+a);
printf(" ");
}
close(in);
}
补充(参考结对同伴的博客 理解了老师的意思!)
通过这次的课堂实践我认识到我实现的是od -tc -tx的功能,而od -tc -tx1实现的功能是将内容以十六进制显示,并以一个字节为单位,两者的区别是多了一个1,如果tx后面没有参数,默认的是四字节为一组,如有参数SIZE,以SIZE字节为一组输出。修改代码后,实现od -tc -tx1功能。