Linux程序基本开发
Vi/gedit编辑器的使用
vi/vim 的使用
vi/vim 分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode
命令模式:
用户启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
以下是常用的几个命令:
i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
: 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式
在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
q 退出程序
w 保存文件
按ESC键可随时退出底线命令模式。
gedit 的使用
gedit
是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312、gbk在内的多种字符编码。gedit是一个自由软件。
这是 Linux 下的一个纯文本编辑器,但你也可以把它用来当成是一个集成开发环境 (IDE), 它会根据不同的语言高亮显现关键字和标识符。
具体操作跟windows的文件编辑差不多,比较简单
gedit是图形界面下的文本编辑
vi是命令界面和图形界面均可使用
gcc介绍与使用
gcc基本介绍
gcc
GCC不只是一个C编译器
GCC = GNU Compiler Collection
GCC支持多种高级语言的编译
gcc工具
- cpp 预处理器
GNU C编译器在编译前自动使用cpp对程序进行预处理 - gcc
符合ISO等标准的C编译器 - g++
基本符合ISO标准的C++编译器 - gcj
GCC的java前端 - gnat
GCC的GNU ADA 95前端
GNU工具——gcc
GNU工具是一个强大的工具集合,包含预处理器、编译器、汇编器、链接器等组件
gcc下的C程序编译过程
1.预处理
2.编译成汇编代码
3.汇编成目标代码
4.链接
gcc使用
编写一个简单的helloworld代码
编译运行
编译时,使用-v选项,可看到许多被隐藏的信息
gcc -o gcctest gcctest.c -v
预处理
使用**-E**参数输出文件的后缀为.cpp
gcc –E –o gcctest.cpp gcctest.c
使用wc
命令比较预处理后的文件与源文件,可以看到两个文件的差异
编译成汇编文件
预处理文件 => 汇编代码
使用-x
参数说明根据指定的步骤进行工作
cpp-output
指明从预处理得到的文件开始编译
使用-S
说明生成汇编代码后停止工作
gcc –x cpp-output –S –o gcctest.s gcctest.cpp
也可以直接编译到汇编代码
gcc –S gcctest.c
编译成目标代码
汇编代码 => 目标代码
gcc –x assembler –c gcctest.s
-c
:只编译不链接
直接编译成目标代码
gcc –c gcctest.c
使用汇编器生成目标代码
as –o gcctest.o gcctest.s
编译成执行代码
目标代码 => 执行代码
gcc –o gcctest gcctest.o
直接生成执行代码
gcc –o gcctest gcctest.c
gcc的高级选项
-Wall
:打开所有的警告信息
gcc优化编译
优化编译选项
O0
:缺省情况,不优化O1
:第一级优化
优化取决于目标处理器
通常包括线程跳转(减少跳转次数)、延迟退栈(在嵌套函数调用时推迟退栈时间,直到递归结束)O2
:
包括O1级优化
调整处理器指令执行时序,优化处理器在等待其他指令结果或数据延迟时可执行其他不相关指令O3
包括O2级优化
使内嵌函数、循环展开
执行与特定处理器特性相关的优化
gcc优化编译举例
测试代码
不同的优化编译
使用time
命令统计程序的运行
GNU binutils简介
GNU binutils
是一组二进制工具程序集
-
addr2line
将程序地址转换为文件名和行号
在命令行中给出地址和可执行文件名,使用可执行文件的调试信息指出对应源文件以及行号 -
ar
建立、修改、提取归档文件
归档文件结构保证可恢复原始文件内容 -
as
GNU汇编器,主要用来编译gcc输出的汇编文件
将汇编代码转换成二进制代码,并放到一个文件
该目标文件将由连接器ld连接 -
ld
连接器,将目标和归档文件结合起来形成可执行文件
通常,建立一个新编译程序的最后一步就是调用ld
-
nm
-
列出目标文件中的符号
-
objcopy
将一种类型目标文件转换成另一种类型的目标文件 -
objdump
显示一个或更多目标文件的信息
使用选项来控制其显示的信息 -
ranlib
产生归档文件索引,并将其保存到这个归档文件中
索引列出归档文件各成员所定义的可重分配目标文件 -
readelf
列出目标文件每一段的大小以及总体的大小
显示elf格式可执行文件的信息 -
size
列出目标文件每一段的大小以及总体的大小
ar
用于建立、修改、提取归档文件(archive)
- 一个归档文件可包含多个文件(也可认为归档文件是一个库文件)
- 归档文件保存被包含原始文件的内容、权限、时间戳、所有者等属性,在提取后可被还原
nm
- 列出目标文件中的符号
- 程序员可定位和分析执行程序/目标文件中的符号信息及其属性
- 显示的符号类型
- A:符号的值是绝对值,不会被将来的链接所改变
- B:符号位于未初始化数据部分(BSS段)
- C:符号是公共的
- 公共符号是未初始化的数据
- 在链接时,多个公共符号可能以相同的名字出现
- 如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理
- D:符号位于已初始化的数据部分
- T:符号位于代码部分
- U:符号未被定义
- ?:符号类型未知或目标文件格式特殊
objcopy
将一种格式文件生成另一种格式文件
使用file命令查看文件类型
file test
生成srec格式的目标文件
objcopy -O srec test ts
使用file命令查看新文件的类型
file ts
objdump
显示一个或多个目标文件的信息
- 由相应选项控制显示哪些信息
- 可通过该工具查看执行文件或库文件的信息
objdump
对编写编译工具、分析代码执行机制非常有用
objdump -f test
-f
选项:显示头文件内容
readelf
显示一个或多个ELF格式的目标文件信息
readelf -h test
Linux的可执行文件格式
- a.out格式(assembler and link editor output)
- 早期UNIX系统使用的可执行文件格式
- 文件头部结构定义(include/asm-x86/a.out.h)
- 现在基本被ELF文件格式代替
- COFF格式(Common Object File Format)
- 包括文件头、可选头部及一些节(section)
.text, .data和.bss区段各有一个小节,还可包含其他区段 - 一个可选头部,对不同操作系统作特定定义
- 文件定义位置:include/linux/coff.h
- 包括文件头、可选头部及一些节(section)
- ELF格式(Executable and Linking Format)
- 代码、链接和注释都以段存在,节点表(Section Header Table)有一个表项与每个小节对应
- 文件类型:.o目标文件、.so动态库文件、可执行文件
- ELF格式可以比COFF格式包含更多的调试信息
- SREC
- MOTOROLA S-Recoder格式(S记录格式文件)
GNU gdb
gdb = GNU debuger
- 设置断点
- 监视、修改变量
- 单步执行
- 显示/修改寄存器的值
- 查看堆栈
- 远程调试
gdb常用命令
gcc的-g参数
gcc –g –o bug bug.c
-g
:在可执行程序中包含标准调试信息