20135210程涵 信息安全系统设计基础第二周学习总结
20135210程涵 信息安全系统设计基础第二周学习总结
学习计时:共15小时
读书:5
代码:4
作业:4
博客:2
一、学习目标
1.熟悉Linux系统下的开发环境
2.熟悉vi的基本操作
3.熟悉gcc编译器的基本原理
4.熟练使用gcc编译器的常用选项
5.熟练使用gdb调试技术
6.熟悉makefile基本原理及语法规范
7.掌握静态库和动态库的生成
二、学习任务
1.教材第一章,第七章学习:阅读并消化教材内容
2.《嵌入式Linux应用程序开发标准教程》第三章3.1-3.5的学习
3.完成实验:
练习vimtutuor
练习gcc编译运行代码
练习gdb调试代码
把上述代码中除了main函数外的代码制作成一个静态库math.a和一个共享库math.so
编写makefile,让代码编译,上述静态库和共享库的使用自动化。
三、学习过程
Linux下C语言编程基础
1.Vim
vim有三种模式:命令行模式、插入模式、底行模式。
移动光标:
[[ 转到上一个位于第一列的"{"
]] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
% 匹配括号移动
* 匹配光标当前所在的单词,移动光标到下一个。(# 上一个)
进行快速调整缩进操作(普通模式下输入)
>> 整行将向右缩进(使用,用于格式化代码超爽)
<< 整行向左回退
进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数
调整文本位置
:ce(center)命令使本行内容居中;
:ri(right)命令使本行文本靠右;
:le(left)命令使本行内容靠左;
视窗操作
Ctrl+w <某些字母> 调整视窗
文档加密
$vim -x file(创建加密文档)
在vim执行外部命令
! 可执行外部的shell部分
帮助系统
普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件
命令行模式下输入:ver 显示版本及参数
功能设定
1).vim的功能设定
命令行模式下输入:set nu(显示行数),设定值退出vim后不会保存。
vim的配置文件~/.vimrc,打开文件进行修改。(要永久保存配置需要修改vim配置文件。)
2).获取目前的设定(命令行模式下输入)
:set或者:se显示所有修改过的配置
:set all 显示所有的设定值
:set option? 显示option的设定值
:set nooption 取消当期设定值
3).set功能的说明(命令行模式下输入)
:set autoindent(ai) 设置自动缩进
:set autowrite(aw) 设置自动存档,默认未打开
:set background=dark或light,设置背景风格
:set backup(bk) 设置自动备份,默认未打开
: set cindent(cin) 设置C语言风格缩进
2.GCC
(1)编译时要加“-g”参数(参数连起来是“ESc”,相应输入的文件的后缀是“iso”)
(2)静态库
所有的编译系统都提供一种机制,将所有相关的目标模块打包成为一个单独的文件,称为静态库,可以作为链接器的输入。当链接器构造一个输出的可执行文件时,它只拷贝静态库里被应用程序引用的目标模块。
在Unix系统中,静态库以一种称为存档的特殊文件格式存放在磁盘中。存档文件是一组连接起来的可重定位目标文件的集合,有一个头部用来描述每个成员目标文件的大小和位置。存档文件由后缀.a识别。
创建静态库:①gcc -c unsgn_pow.c //unsgn_pow为函数名
② ar rcsv libpow.a unsgn_pow.o
③a - unsgn_pow.o
④编译主程序:gcc -o pow_test pow_test.c -L. -lpow。
(3)动态库
共享库是一个目标模块,在运行时可以加载到任意的存储器地址,并和一个在存储器中的程序链接起来。这个过程称为动态链接,是由一个叫做动态链接库的程序来执行。
①为动态库构造目标文件:gcc -fpic -Wall -C unsgn_pow.c
②生成动态可:gcc -shared -o libpow.so unsgn_pow.o
③链接到刚生成的动态库:gcc -o pow_test pow_test.c -L. -lpow
3.GDB
1.启动gdb的方法有以下几种:
a)gdb <program> program也就是执行文件,一般在当前目录下。
b)gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
c)gdb <program> <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。
2.设置断点
(gdb) break func <-------------------- 设置断点,在函数func()入口处。
(gdb) info break <-------------------- 查看断点信息。
(gdb) r <--------------------- 运行程序,run命令简写
(gdb) n <--------------------- 单条语句执行,next命令简写。
(gdb) c <--------------------- 继续运行程序,continue命令简写。
(gdb) p I <--------------------- 打印变量i的值,print命令简写。
(gdb) bt <--------------------- 查看函数堆栈。
(gdb) finish <--------------------- 退出函数。
(gdb) c <--------------------- 继续运行。
(gdb) q <--------------------- 退出gdb。
3.其他调试命令有:
- display 跟踪变量值的改变
- until 跳出循环
- finish 跳出函数
- help 帮助
4.makefile
一个Makefile文件主要含有一系列的规则,每条规则包含一下内容:一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’;一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,并以tab开头(初学者务必注意:是tab,而不是空格)自后便完成自动编译
Makefile中的宏,也称作变量。
变量是在makefile中定义的名字,用来代替一个文本字符串,该文本字符串称为该变量的值。
定义变量的两种方式:
(1)递归展开方式
VAR=var
(2)简单方式
VAR:=var
使用变量的格式为:$(VAR)
变量分为:用户自定义变量、预定义变量、自动变、环境变量。
作业
一开始分开编译运行gdb结果失败,重新根据书上的指导一起运行,结果正常如下。
另外,现在我们的学习模式是先自学、考试,然后老师再给我们巩固一遍。
这样的话自学还是挺耗时间的,不是说不愿意花时间,而是希望老师让我们用更有效率的学习方式。
建议老师在课上对下一周同学要自学的内容进行预先的指引,这样很多无谓的错误就不会出现在自学时间里了。