Linux实验总结(第二周)
测试一——vi
- 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
- 用Vi输入图中代码,并用gcc编译通过
- 在Vi中使用K查找printf的帮助文档
- 提交vi编辑过程截图,要全屏,包含自己的学号信息
步骤
使用 mkdir
分别创建三个目录,分别存放源码,头文件和输出文件,输入命令 vi *.c
或 vi *.h
,敲入代码即可,以下是输入完毕后的文件及文件夹目录:
这是vi中的printf帮助文档,首先 cd src
,然后 vi main.c
,将光标移动到printf上去,按大写的K即可:
通过gcc编译通过
gcc -I include src/*.c -o bin/20199324
测试二——gcc测试
- 用 gcc 进行预处理,编译,汇编,链接vi输入的代码
- 生成的可执行文件中要有自己的学号
- 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
使用到的命令
gcc -E .c -o .i //预处理
gcc -S .i -o .s //编译,产生汇编代码
gcc -c .s -o .o //汇编,编译为目标文件(.o文件,可重定位目标文件)
gcc *.o -o XXX //链接生成可执行文件
步骤
预处理:
gcc -E -I include src/*.c -o bin/*.i
编译:
gcc -S -I include bin/*.i -o bin/*.s
汇编:
gcc -c -I include bin/*.s -o bin/*.o
链接:
cd bin
gcc *.o -o test
测试三——gdb测试
- 用
gcc -g
编译vi输入的代码 - 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
gdb相关命令
[root@redhat home]# gdb 调试文件
:启动gdb(gdb) l
:从第一行开始列出源码(gdb) r
Run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处;(gdb) n
单步执行(gdb) c
Continue的简写,继续执行被调试程序,直至下一个断点或程序结束;(gdb) b 8
b: Breakpoint的简写,设置断点。在源程序第8行;(gdb) b X(整数) if i==X
设置条件断点,在for循环后一行设置;(gdb) p <变量名称>
Print的简写,打印变量的值;(gdb) q
Quit的简写,退出GDB调试环境;(gdb)info b
查询所有断点;(gdb)delete 行号
删除断点
步骤
首先要gcc -g来生成一个可执行文件
gcc -g *.c
设置一个行断点:
设置条件断点:
测试四——静态库的测试
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
- 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
步骤
- 无论静态库,还是动态库,都是由.o文件创建的。
分别对四个c文件生成编译文件 (因为之前已经有编译好的.o文件,所以没有重复该步骤。。。但是后来gdb调试的时候发现不行,因为之前编译的.o文件时候没有加-g
,所以还是得加这一步骤)
gcc -g -c *.c
- 然后将编译文件生成mymath.a静态库
ar rcvs(rc/rcs) mymath.a add.o sub.o div.o mul.o
- 用mymath.a文件生成一个可执行文件prog
gcc -g -static -o prog main.o ./mymath.a
- 运行
./prog
对可执行文件的调试:
测试五——共享库
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
- 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
步骤
- 编译生成共享库。加上
-shared -fpic
参数,生成共享文件mymath.so
gcc -g -shared -fpic -o mymath.so add.c sub.c mul.c div.c
- 编译生成可执行文件
gcc -g -o prog1 mian.c ./mymath.so
- 运行
./prog1
知识点:
- 什么是库?
- 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
- 由于windows和linux的本质不同,因此二者库的二进制是不兼容的。
- 库的种类
- linux下的库有两种:静态库和共享库(动态库)。 二者的不同点在于代码被载入的时刻不同。
- 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
- 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
- 静态库的后缀是 .a
- 动态库的后缀是 .so
测试六-Makefile
- 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath,只用显式规则就可以
- 提交Make过程截图,要全屏,包含自己的学号信息
- Makefile
- 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个
make
命令,整个工程完全编译,极大的提高了软件的开发效率。 - makefile文件编写规则:
- 目标文件:由make创建,通常是目标文件或可执行文件
- 依赖文件:创建目标体所依赖的文件
- 运行命令:创建每个目标体时需要的运行命令,必须以tab键开头
- 格式为:目标文件:依赖文件列表 [tab键]各目标体运行命令(注意不是空格)
- 使用make的格式:make 目标文件
- 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个
步骤:
- 输入
sudo gedit Makefile
,输入代码并保存。编写的Makefile文件内容:
testmymath: main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o testmymath
main.o: main.c head.h
gcc -c main.c
add.o: add.c head.h
gcc -c add.c
sub.o: sub.c head.h
gcc -c sub.c
mul.o: mul.c head.h
gcc -c mul.c
div.o: div.c head.h
gcc -c div.c
- 输入
make
,进行自动化编译 - 执行
./testmymath
查看结果
注意:(自己虚拟机下命令的注意事项)
- 删除普通文件
gcc rm 文件名
- 删除当前目录下的所有文件及目录
gcc rm -rf 目录名
用vim或gedit(文本编辑器)时候一定要在前面加
sudo
,否则没有权限修改或保存。-I xxx 的意思是除了默认的头文件搜索路径(比如/usr/include等)外,同时还在路径xxx下搜索需要被引用的头文件。
gcc常用命令区分
gcc -c *.c
//把.c文件转换为目标文件.o (预处理、编译、汇编)
gcc *.c
// 编译成a.out可执行文件
gcc *.c -o XXX
//一步到位的编译指令(实质上,该编译过程是分为四个阶段进行:预处理、编译、汇编、链接)
用 gcc -g
编译vi输入的代码:加上-g选项以后,gcc在编译是会做以下额外的操作:
- 创建符号表,符号表包含了程序中使用的变量名称的列表。
- 关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行。
- -g为了调试用的。加个-g 是为了gdb 用,不然gdb用不到。
参考资料:
https://blog.csdn.net/oqqhutu12345678/article/details/78938688
https://blog.csdn.net/Linkthaha/article/details/39996897
https://blog.csdn.net/zhangsmlyl/article/details/78941158
https://zhidao.baidu.com/question/313935918.html
Linux实验总结(第二周)的更多相关文章
- Linux内核设计第二周——操作系统工作原理
Linux内核设计第二周 ——操作系统工作原理 作者:宋宸宁(20135315) 一.实验过程 图1 执行效果 从图中可以看出,每执行my_ start_ kernel函数两次或一次,my_ time ...
- LINUX内核分析第二周学习总结——操作系统是如何工作的
LINUX内核分析第二周学习总结——操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- Linux内核分析第二周学习笔记
linux内核分析第二周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第二周--操作系统是如何工作的
Linux内核分析第二周--操作系统是如何工作的 李雪琦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...
- Linux内核分析第二周学习博客——完成一个简单的时间片轮转多道程序内核代码
Linux内核分析第二周学习博客 本周,通过实现一个简单的操作系统内核,我大致了解了操作系统运行的过程. 实验主要步骤如下: 代码分析: void my_process(void) { int i = ...
- linux内核分析第二周
网易云课堂linux内核分析第二周 20135103 王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...
- Linux内核分析——第二周学习笔记20135308
第二周 操作系统是如何工作的 第一节 函数调用堆栈 存储程序计算机:是所有计算机基础的框架 堆栈:计算机中基础的部分,在计算机只有机器语言.汇编语言时,就有了堆栈.堆栈机制是高级语言可以运行的基础. ...
- linux内核分析第二周-完成一个简单的时间片轮转多道程序内核代码
中断时计算机运行的一个非常重要的功能.之所以重要,是因为由于种种原因,计算机不能将一个程序从头执行到尾不间断,而是可能会出现很多像等待输入设备输出设备的过程,如果没有中断系统,CPU只能等待,造成资源 ...
- Linux内核分析第二周学习总结:操作系统是如何工作的?
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 ...
- Linux内核分析第二周:操作系统是如何工作的
第一讲 函数调用堆栈 计算机是如何工作的? (总结)——三个法宝 1,存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 2,函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆 ...
随机推荐
- java处理浮点数小数点后几位
转载:https://blog.csdn.net/xue_feitian/article/details/6556275 第一种方法: double f = 123.2315455458; BigDe ...
- 【LeetCode】N皇后I
[问题]n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案.每一种解法包含一个明确的 n 皇后问 ...
- jQuery中的一些方法 19.5.20课上笔记
after() insertAfter():特定元素后面插入新的节点 before() insertBefore():特定元素前面插入新的节点 append() appendTo():向特定元素元素内 ...
- 面向对象变成(OOP)-创建类和使用类
1.1.1对象的抽象:抽象是一种归纳或总结,对象是现实世界物体特征的实例. (1)一切皆是对象. (2)类是对象的抽象. 1.1.2 对象的使用: 当对象被抽象为类以后,就可以创建具体的实例来操作了. ...
- Delphi流的操作_文件合并
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- winform 集成 log4net
1.引入库log4net.dll 2.展开项目文件下的Properties文件夹,打开AssemblyInfo.cs并在AssemblyInfo.cs中添加一行:在AssemblyInfo.cs中添加 ...
- hdu 3483 矩阵乘法
这个题目上周对抗赛题目,搞了我好久 对数学这种不是很敏感 其实都不是自己想出来的,看其他的资料和博客的推导 还是有点难度的,反正我是推不出来 通过二项式定理的化简 有两个博客写得比较好 http:// ...
- [RoarCTF 2019]Easy Calc-协议层攻击之HTTP请求走私
0X01:什么是HTTP请求走私 HTTP请求走私属于协议层攻击,是服务器漏洞的一种. HTTP请求走私是一种干扰网站处理从一个或多个用户接收的HTTP请求序列的方式的技术.使攻击者可以绕过安全控制, ...
- JavaScript学习总结(四)
这一部分我们继续介绍JavaScript的常用对象. Number对象 创建Number对象 方式1: var 变量= new Number(数字) 方式2: var 变量 = 数字; 常用的方法 t ...
- c语言:自增自减运算符的操作详解
博主在回忆c语言的基本知识时,突然发现自增自减运算符(--.++)这个知识点有些模糊不清,故博主为了给同为小白的同学们提供一些经验,特写下这篇文章. 首先,自增自减运算符共有两种操作方式. 比如,我先 ...