GNU 相关工具概述
description
Transcript of GNU 相关工具概述
![Page 1: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/1.jpg)
©2007 ZTE corporation
GNUGNU 相关工具概述相关工具概述成研所操作系统团队
![Page 2: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/2.jpg)
目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具
![Page 3: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/3.jpg)
GNU 介绍 FSF(Free Software Foundation)
GNU 计划的主要发起者 . FSF 主要依靠个体的开发人员及团体支持,并与个别发展基金及集团有合作 主要致力于自由的开发、使用、学习、拷贝、分发、修改计算机软件,并维护自由软件用户的权益。
GNU 计划FSF 于 1984 年开始研发的,与 Unix 相似的操作系统及其支持工具 ( 包括 GCC 、 GDB..) ,纯自由软件
![Page 4: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/4.jpg)
GPL
GPL=General Public License( 通用公共授权 ) 条款目的
倡导软件的共享与修改自由 吸引更多开发人员投入自由软件的海洋
条款主要内容 共 13 条,详情请看 www.gnu.org
我们如何使用? 所有 FSF 发布的软件,开发人员在使用、修改、发布、复制过程中需遵循 GPL
![Page 5: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/5.jpg)
开发的全过程
检查语法
编译编译编译
.c
建依赖关系链接
.o 、 .a 、 .so .out 调试
排错
代码出错
编辑编辑编辑
编写代码
![Page 6: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/6.jpg)
Linux 开发相关工具 GCC
编译工具链,包括预处理、编译、汇编、链接 Make
工程管理器,其实是由一套 Makefile 定义规则 GDB
用户态调试器,支持常用的运行、打断点、单步调试、查看功能 Binutils
2 进制开发、管理工具套件
![Page 7: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/7.jpg)
使用 GNU 工具开发示例 编译
gcc -o hello.o –c hello.c 链接
gcc h1.h hello.o –o hello.out 调试
gdb run hello.outbreak 61continue info registers
![Page 8: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/8.jpg)
目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具
![Page 9: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/9.jpg)
C 编译器 GCC
GCC 是一套编译工具链的接口 预处理器 CPPC 编译器 汇编器 AS 链接器 LD
一条典型的 GCC 命令:gcc –o hello.o –c hello.c
编译 hello.c 并生成目标文件 hello.o 每个选项对应一个工具,由 gcc 做为命令接口
![Page 10: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/10.jpg)
GCC 常用命令行选项 -o 指定生成的文件名,默认为 a.XXX -E 只做预处理,生成 .i 文件 -S 只做预处理和编译,不汇编,生成 .S 文件 -c 只编译,不进行链接,生成 .o 文件 不加参数,编译、链接生成可执行文件 .out
![Page 11: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/11.jpg)
GCC 常用命令行选项 -I 指定链接时头文件搜索目录 -L 指定链接时函数库搜索目录 -O1/O2/O3 代码优化,自动提升编译出的可执行文件执行效率,但编译速度慢, release版常用 -g 编译时创建调试信息,调试前必须使用 -Wall 产生全部警告信息
![Page 12: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/12.jpg)
GCC 对 C 语言的扩展 GCC 有一套扩展过的 C ,由 GCC 唯一识别 C 扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持 Linux 内核代码使用了大量的 GCC 扩展 C ,因此 GCC 唯一能编译 Linux 内核。
![Page 13: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/13.jpg)
目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具
![Page 14: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/14.jpg)
使用 GDB
直接打 gdb 进入 GDB 命令提示符 或者 gdb – 参数
-symbols 从指定文件提取符号表 -se 从指定文件中读取符号表信息,并把他用在可执行文件中 -directory 添加源文件搜索路径,默认为环境变量 PATH 中的路径 -core 同时调试程序和 core 文件 ( 程序非法执行后 core dump 生成文件)
![Page 15: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/15.jpg)
GDB 主要功能 进入后打 help command 查看帮助 程序运行
run 运行程序 set args / show args 设置 / 查看运行参数 path / show path 设置 / 查看程序运行路径 set environment 设置环境变量
![Page 16: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/16.jpg)
GDB 主要功能 停止及恢复
断点 ( 行 / 函数 )• break 指定行或函数• break …if 设置断点条件,如 if i=5• info break 查看所有断点
观察点 ( 表达式 )• watch 设置观察点,当表达式值发生改变时停住• rwatch 当表达式读取时停住• awatch 当表达式读 / 写时停住• info watchpoints 查看所有观察点
捕捉点 ( 事件 )• catch 当指定事件发生时停住
![Page 17: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/17.jpg)
GDB 主要功能 停止及恢复
停止点操作• clear 清除所有停止点• delete 删除指定停止点• disable/enable 临时关闭 / 开启停止点
恢复• continue 恢复程序运行• step 单步跳入• next 单步跳过• finish 单步返回
![Page 18: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/18.jpg)
GDB 主要功能 查看信息
info stack 查看栈信息 info registers 查看寄存器print expression 查看表达式print /fmt [var] 查看变量x /fmt [adress] 查看内存
![Page 19: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/19.jpg)
GDB 主要功能 改变执行
print var=value 修改变量值 jump file:line 跳到 n 行执行 return 强制函数返回call 强制调用函数
![Page 20: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/20.jpg)
目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具
![Page 21: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/21.jpg)
为什么使用 Make
一个没有工程管理器的大型工程,犹如一盘散沙 如果按照 1-3 章所讲,我们需要为每一个文件修改,重新编译所有文件。 如果说 Make 是一次联赛的组织者, Makefile就是赛程表,登记了所有的选手,以及他们的比赛顺序。 一个大型工程的所有文件编译、链接,只需要一个 Make 命令
![Page 22: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/22.jpg)
Make 常用命令选项 大多数时候,我们只需要打命令 Make 目标名 除此之外, Make 提供了丰富的命令行选项
-n 打印 make 动作而不执行 -f file 指定某个文件作为 makefile -o *.h 忽略某个头文件 -t 更新目标文件设置日期 -C dir 切换工作目录到 dir 下执行 Make -d Make 过程输出所有调试信息 -i 忽略所有规则命令运行错误 -s 执行中不显示命令 - r 取消隐式规则
![Page 23: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/23.jpg)
Makefile 浅析 一个例子
hello.o : hello.c hello.h GCC –c hello.c –o hello.o其实就是:目标文件:依赖文件
命令 ( 前面加 TAB 表示命令 )规则是:依赖文件 -> 命令 -> 目标文件
![Page 24: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/24.jpg)
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)
变量定义
使用变量
伪目标
![Page 25: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/25.jpg)
makefile 规则 一条语句就是一条规则 为了简化编写衍生的两种规则
模式规则• 使用模式字符“%”来匹配目标文件,从而衍生出一系列规则,如多目标、万用规则、自动化变量。使用模式规则时,目标文件匹配后得到“茎”,依赖根据“茎”产生依赖文件。
隐式规则• 一系列Make 自动将 .c 文件生成 .o 文件的默认规则,除非加上 -r 选项,否则将默认使用。• 隐式规则中使用隐含变量,如 .c 源文件的隐式规则是:
$(CC) –c $(CFLAGS)$(CPPFLAGS)
![Page 26: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/26.jpg)
Make 如何解析 makefile
第一阶段: 读取所有 makefile 文件,所有变量、模式规则和隐式规则。并建立所有目标和依赖之间的依赖关系表。
第二阶段根据目标依赖关系表确定哪些目标需要更新,并使用对应规则重建这些目标。
![Page 27: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/27.jpg)
目录• GNU 工具介绍• GCC 编译工具链• 调试工具 GDB• Make 工程管理器• Binutils 二进制工具
![Page 28: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/28.jpg)
Binutils 介绍 什么是 Binutils
Binutils 提供了一系列用来创建、管理和维护二进制目标文件的工具程序。事实上,前面讲 GCC 时介绍的汇编工具 AS 和链接工具 LD都是 Binutils 的组件之一。 Binutils 和 GCC 的关系
通常, binutils 与 gcc 是紧密集成的,没有 binutils的话, gcc 是不能正常工作的。
![Page 29: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/29.jpg)
Binutils 二进制工具 ar
静态库文件 .a专用工具,创建、查看、修改 objcopy
将代码从 elf 文件提取,形成机器码文件 .bin objdump
反汇编查看目标文件 .o readelf
查看 .elf类型目标文件内容
![Page 30: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/30.jpg)
Binutils 二进制工具 nm
列出 .o 文件中的符号 ranlib
在归档文件 .a 中产生索引,此索引对 .a 中所有成员的符号进行列表。 size
查看 .o 文件内部各字段大小 strings
打印某文件中的可打印字符串,主要用于判断非字符文件中可打印部分
![Page 31: GNU 相关工具概述](https://reader031.fdocument.pub/reader031/viewer/2022020711/56813acf550346895da2f478/html5/thumbnails/31.jpg)
©2007 ZTE corporation