(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用

Linux程序基本开发

    • Vi/gedit编辑器的使用
      • vi/vim 的使用
      • gedit 的使用
    • gcc介绍与使用
      • gcc基本介绍
        • gcc
        • gcc工具
        • GNU工具——gcc
      • gcc使用
        • 预处理
        • 编译成汇编文件
        • 编译成目标代码
        • 编译成执行代码
      • gcc的高级选项
      • gcc优化编译
      • gcc优化编译举例
      • GNU binutils简介
        • ar
        • nm
        • objcopy
        • objdump
        • readelf
      • Linux的可执行文件格式
    • GNU gdb
      • gdb常用命令

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键可随时退出底线命令模式。

(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第1张图片

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代码
(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第2张图片
编译运行
(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第3张图片

编译时,使用-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:打开所有的警告信息
(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第4张图片

gcc优化编译

优化编译选项

  • O0缺省情况,不优化
  • O1第一级优化
    优化取决于目标处理器
    通常包括线程跳转(减少跳转次数)、延迟退栈(在嵌套函数调用时推迟退栈时间,直到递归结束)
  • O2
    包括O1级优化
    调整处理器指令执行时序,优化处理器在等待其他指令结果或数据延迟时可执行其他不相关指令
  • O3
    包括O2级优化
    使内嵌函数、循环展开
    执行与特定处理器特性相关的优化

gcc优化编译举例

测试代码
(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第5张图片
不同的优化编译
(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第6张图片
使用time命令统计程序的运行

(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第7张图片

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
  • ELF格式(Executable and Linking Format)
    • 代码、链接和注释都以段存在,节点表(Section Header Table)有一个表项与每个小节对应
    • 文件类型:.o目标文件、.so动态库文件、可执行文件
    • ELF格式可以比COFF格式包含更多的调试信息
  • SREC
    • MOTOROLA S-Recoder格式(S记录格式文件)

GNU gdb

gdb = GNU debuger

  • 设置断点
  • 监视、修改变量
  • 单步执行
  • 显示/修改寄存器的值
  • 查看堆栈
  • 远程调试

gdb常用命令

(1)Linux程序基本开发 --编辑器使用,gcc介绍与使用_第8张图片
gcc的-g参数

gcc –g –o bug bug.c

-g:在可执行程序中包含标准调试信息

你可能感兴趣的:(linux)