20155336 2017-2018 1 《信息安全系统设计基础》2017-9-27课堂实践

第一题:vi

  1. 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号

  2. 用Vi输入图中代码,并用gcc编译通过

  3. 在Vi中使用K查找printf的帮助文档

  4. 提交vi编辑过程截图,要全屏,包含自己的学号信息

    说起来很惭愧,第一次接触虚拟机,对很多地方都陌生,正好趁学习这门课程掌握一下虚拟机的基本操作。
    首先创建一个文件夹,命名为text1。然后将第一道题的要求都录入进去。录入完毕后,输入gcc *.c,
    发现了错误,然后vi进入到.c的文件中,修改了错误再次编译一遍,没有错误,然后就输出./a.out

代码链接

第二题:gcc测试

  1. 用gcc 进行预处理,编译,汇编,链接vi输入的代码

  2. 生成的可执行文件中要有自己的学号

  3. 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息

    第二题,按照第一节课课上记得笔记,在课下自己实践。虽然中间粗心代码出现错误,但是问题不大

代码链接

第三题:gdb测试

  1. 用gcc -g编译vi输入的代码
  2. 在main函数中设置一个行断点
  3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
  4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
这道题出现了很多问题,首先下载GDB,然后在设置了条件断点之后,程序调试的时候没有在断点处停下。在空循环中加个打印空行再设置条件断点然后运行就可以了。(中间由于很多次自己都忘记了编译~~~~~导致每次都会显示自己定义的n没有定义。)

代码链接

第四题:静态库测试

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

  2. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    这道题将自己的代码编译为以下形式:
    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
    接着运行就可以了!
    

第五题:共享库

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

  2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

    创建一个共享文件
    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的功能

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

  2. 编写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功能。

posted on 2017-12-05 18:43  丿尛丶熊  阅读(118)  评论(0编辑  收藏  举报