310 likes | 488 Vues
GNU 相关工具概述. 成研所操作系统团队. GNU 工具介绍 GCC 编译工具链 调试工具 GDB Make 工程管理器 Binutils 二进制工具. 目录. GNU 介绍. FSF(Free Software Foundation) GNU 计划 的主要发起者 . FSF 主要依靠个体的开发人员及团体支持,并与个别发展基金及集团有合作 主要致力于 自由 的开发、使用、学习、拷贝、分发、修改计算机软件,并维护自由软件用户的权益。 GNU 计划
E N D
GNU相关工具概述 成研所操作系统团队
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.out • break 61 • continue • info registers
GNU工具介绍 GCC编译工具链 调试工具GDB Make工程管理器 Binutils二进制工具 目录
C编译器GCC • GCC是一套编译工具链的接口 • 预处理器CPP • C编译器 • 汇编器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=GCC PROGS=howdy hello CFLASS=-Wall all : $ (PROGS) howdy : howdy.c hello : hello.c $ (CC) $ (CFLASS) hello.c –o hello clean: rm -f *.o rm -f *.so rm -f *.a rm –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 • 打印某文件中的可打印字符串,主要用于判断非字符文件中可打印部分