GNU 相关工具概述

Preview:

DESCRIPTION

GNU 相关工具概述. 成研所操作系统团队. GNU 工具介绍 GCC 编译工具链 调试工具 GDB Make 工程管理器 Binutils 二进制工具. 目录. GNU 介绍. FSF(Free Software Foundation) GNU 计划 的主要发起者 . FSF 主要依靠个体的开发人员及团体支持,并与个别发展基金及集团有合作 主要致力于 自由 的开发、使用、学习、拷贝、分发、修改计算机软件,并维护自由软件用户的权益。 GNU 计划 - PowerPoint PPT Presentation

Citation preview

©2007 ZTE corporation

GNUGNU 相关工具概述相关工具概述成研所操作系统团队

目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具

GNU 介绍 FSF(Free Software Foundation)

GNU 计划的主要发起者 . FSF 主要依靠个体的开发人员及团体支持,并与个别发展基金及集团有合作 主要致力于自由的开发、使用、学习、拷贝、分发、修改计算机软件,并维护自由软件用户的权益。

GNU 计划FSF 于 1984 年开始研发的,与 Unix 相似的操作系统及其支持工具 ( 包括 GCC 、 GDB..) ,纯自由软件

GPL

GPL=General Public License( 通用公共授权 ) 条款目的

倡导软件的共享与修改自由 吸引更多开发人员投入自由软件的海洋

条款主要内容 共 13 条,详情请看 www.gnu.org

我们如何使用? 所有 FSF 发布的软件,开发人员在使用、修改、发布、复制过程中需遵循 GPL

开发的全过程

检查语法

编译编译编译

.c

建依赖关系链接

.o 、 .a 、 .so .out 调试

排错

代码出错

编辑编辑编辑

编写代码

Linux 开发相关工具 GCC

编译工具链,包括预处理、编译、汇编、链接 Make

工程管理器,其实是由一套 Makefile 定义规则 GDB

用户态调试器,支持常用的运行、打断点、单步调试、查看功能 Binutils

2 进制开发、管理工具套件

使用 GNU 工具开发示例 编译

gcc -o hello.o –c hello.c 链接

gcc h1.h hello.o –o hello.out 调试

gdb run hello.outbreak 61continue info registers

目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具

C 编译器 GCC

GCC 是一套编译工具链的接口 预处理器 CPPC 编译器 汇编器 AS 链接器 LD

一条典型的 GCC 命令:gcc –o hello.o –c hello.c

编译 hello.c 并生成目标文件 hello.o 每个选项对应一个工具,由 gcc 做为命令接口

GCC 常用命令行选项 -o 指定生成的文件名,默认为 a.XXX -E 只做预处理,生成 .i 文件 -S 只做预处理和编译,不汇编,生成 .S 文件 -c 只编译,不进行链接,生成 .o 文件 不加参数,编译、链接生成可执行文件 .out

GCC 常用命令行选项 -I 指定链接时头文件搜索目录 -L 指定链接时函数库搜索目录 -O1/O2/O3 代码优化,自动提升编译出的可执行文件执行效率,但编译速度慢, release版常用 -g 编译时创建调试信息,调试前必须使用 -Wall 产生全部警告信息

GCC 对 C 语言的扩展 GCC 有一套扩展过的 C ,由 GCC 唯一识别 C 扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持 Linux 内核代码使用了大量的 GCC 扩展 C ,因此 GCC 唯一能编译 Linux 内核。

目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具

使用 GDB

直接打 gdb 进入 GDB 命令提示符 或者 gdb – 参数

-symbols 从指定文件提取符号表 -se 从指定文件中读取符号表信息,并把他用在可执行文件中 -directory 添加源文件搜索路径,默认为环境变量 PATH 中的路径 -core 同时调试程序和 core 文件 ( 程序非法执行后 core dump 生成文件)

GDB 主要功能 进入后打 help command 查看帮助 程序运行

run 运行程序 set args / show args 设置 / 查看运行参数 path / show path 设置 / 查看程序运行路径 set environment 设置环境变量

GDB 主要功能 停止及恢复

断点 ( 行 / 函数 )• break 指定行或函数• break …if 设置断点条件,如 if i=5• info break 查看所有断点

观察点 ( 表达式 )• watch 设置观察点,当表达式值发生改变时停住• rwatch 当表达式读取时停住• awatch 当表达式读 / 写时停住• info watchpoints 查看所有观察点

捕捉点 ( 事件 )• catch 当指定事件发生时停住

GDB 主要功能 停止及恢复

停止点操作• clear 清除所有停止点• delete 删除指定停止点• disable/enable 临时关闭 / 开启停止点

恢复• continue 恢复程序运行• step 单步跳入• next 单步跳过• finish 单步返回

GDB 主要功能 查看信息

info stack 查看栈信息 info registers 查看寄存器print expression 查看表达式print /fmt [var] 查看变量x /fmt [adress] 查看内存

GDB 主要功能 改变执行

print var=value 修改变量值 jump file:line 跳到 n 行执行 return 强制函数返回call 强制调用函数

目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具

为什么使用 Make

一个没有工程管理器的大型工程,犹如一盘散沙 如果按照 1-3 章所讲,我们需要为每一个文件修改,重新编译所有文件。 如果说 Make 是一次联赛的组织者, Makefile就是赛程表,登记了所有的选手,以及他们的比赛顺序。 一个大型工程的所有文件编译、链接,只需要一个 Make 命令

Make 常用命令选项 大多数时候,我们只需要打命令 Make 目标名 除此之外, Make 提供了丰富的命令行选项

-n 打印 make 动作而不执行 -f file 指定某个文件作为 makefile -o *.h 忽略某个头文件 -t 更新目标文件设置日期 -C dir 切换工作目录到 dir 下执行 Make -d Make 过程输出所有调试信息 -i 忽略所有规则命令运行错误 -s 执行中不显示命令 - r 取消隐式规则

Makefile 浅析 一个例子

hello.o : hello.c hello.h  GCC –c hello.c –o hello.o其实就是:目标文件:依赖文件

命令 ( 前面加 TAB 表示命令 )规则是:依赖文件 -> 命令 -> 目标文件

Makefile 浅析 复杂一点的例子:

CC=GCCPROGS=howdy helloCFLASS=-Wall

all : $ (PROGS)howdy : howdy.chello : hello.c

$ (CC) $ (CFLASS) hello.c –o hello

clean:rm -f *.orm -f *.sorm -f *.arm –f $ (PROGS)

变量定义

使用变量

伪目标

makefile 规则 一条语句就是一条规则 为了简化编写衍生的两种规则

模式规则• 使用模式字符“%”来匹配目标文件,从而衍生出一系列规则,如多目标、万用规则、自动化变量。使用模式规则时,目标文件匹配后得到“茎”,依赖根据“茎”产生依赖文件。

隐式规则• 一系列Make 自动将 .c 文件生成 .o 文件的默认规则,除非加上 -r 选项,否则将默认使用。• 隐式规则中使用隐含变量,如 .c 源文件的隐式规则是:

$(CC) –c $(CFLAGS)$(CPPFLAGS)

Make 如何解析 makefile

第一阶段: 读取所有 makefile 文件,所有变量、模式规则和隐式规则。并建立所有目标和依赖之间的依赖关系表。

第二阶段根据目标依赖关系表确定哪些目标需要更新,并使用对应规则重建这些目标。

目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具

Binutils 介绍 什么是 Binutils

Binutils 提供了一系列用来创建、管理和维护二进制目标文件的工具程序。事实上,前面讲 GCC 时介绍的汇编工具 AS 和链接工具 LD都是 Binutils 的组件之一。 Binutils 和 GCC 的关系

通常, binutils 与 gcc 是紧密集成的,没有 binutils的话, gcc 是不能正常工作的。

Binutils 二进制工具 ar

静态库文件 .a专用工具,创建、查看、修改 objcopy

将代码从 elf 文件提取,形成机器码文件 .bin objdump

反汇编查看目标文件 .o readelf

查看 .elf类型目标文件内容

Binutils 二进制工具 nm

列出 .o 文件中的符号 ranlib

在归档文件 .a 中产生索引,此索引对 .a 中所有成员的符号进行列表。 size

查看 .o 文件内部各字段大小 strings

打印某文件中的可打印字符串,主要用于判断非字符文件中可打印部分

©2007 ZTE corporation

Recommended