v GNU Tools v GNU Tools 6132021 Embedded
主要内容 v GNU Tools简介 v GNU Tools交叉开发环境及其安装 6/13/2021 Embedded Operating Systems 3
一、GCC v 很多人认为GCC只是一个C编译器, 其实GCC = GNU Compiler Collection v 目前,GCC可以支持多种高级语言,如 Ø C、C++ Ø ADA Ø Object C Ø JAVA Ø Fortran Ø PASCAL 6/13/2021 Embedded Operating Systems 8
gcc使用举例(1) 源程序 6/13/2021 Embedded Operating Systems 11
gcc使用举例(2) 编译和运行 编译 运行 6/13/2021 Embedded Operating Systems 12
6/13/2021 Embedded Operating Systems 14
预编译 行数 单词数 字节数 6/13/2021 Embedded Operating Systems 17
s 预处理文件 汇编代码 直接编译到汇编代码 6/13/2021 Embedded Operating Systems 19
3、编译成目标代码 v 汇编代码 目标代码 gcc –x assembler –c gcctest. s v 直接编译成目标代码 gcc –c gcctest. c v 使用汇编器生成目标代码 as –o gcctest. s 6/13/2021 Embedded Operating Systems 20
4、编译成执行代码 v 目标代码 执行代码 gcc –o gcctest. o v 直接生成执行代码 gcc –o gcctest. c 6/13/2021 Embedded Operating Systems 22
目标代码 执行代码 直接生成执行代码 6/13/2021 Embedded Operating Systems 23
gcc的高级选项 v -Wall:打开所有的警告信息 6/13/2021 Embedded Operating Systems 24
修改源程序 6/13/2021 Embedded Operating Systems 26
gcc的优化编译举例(2) 使用time命令统计程序的运行 6/13/2021 Embedded Operating Systems 29
15. libiberty 包含许多GNU程序都会用到的函数,这些 程序有: getopt, obstack, strerror, strtol 和 strtoul. 16. libbfd 二进制文件描述库. 17. libopcodes 用来处理opcodes的库, 在生成一些应用程 序的时候也会用到它, 比如objdump. Opcodes是文本格 式可读的处理器操作指令. 6/13/2021 Embedded Operating Systems 34
binutils开发 具使用举例 v ar v nm v Objcopy v Objdump v readelf 6/13/2021 Embedded Operating Systems 35
使用ar建立库文件(1) v 源程序add. c和minus. c 6/13/2021 Embedded Operating Systems 37
库文件使用举例 在代码中使用Add和Minus函数 6/13/2021 Embedded Operating Systems 39
在编译时指定库文件 指明将libtest. a链接进来 运行结果 6/13/2021 Embedded Operating Systems 40
文件格式 v a. out: assembler and link editor output 汇编器和链接编辑器的输出 v coff common object file format 一种通用的对象文件格式 v ELF excutive linked file Linux系统所采用的一种通用文件格式,支持动态连接。 ELF格式可以比COFF格式包含更多的调试信息 6/13/2021 Embedded Operating Systems 46
Objdump使用举例(1) -f选项:显示文件头中的内容 6/13/2021 Embedded Operating Systems 49
Objdump使用举例(2) -d选项进行反汇编 6/13/2021 Embedded Operating Systems 50
5、readelf v readelf: 显示一个或多个ELF格式的目标文件信息。 6/13/2021 Embedded Operating Systems 51
Readelf使用举例 6/13/2021 Embedded Operating Systems 52
三、其他GNU 具 v Gdb—调试器 v GNU make--软件 程 具 v diff,patch--补丁 具 v CVS--版本控制系统 6/13/2021 Embedded Operating Systems 53
gdb使用举例 v 源代码如下 编译: gcc –o bug. c 6/13/2021 Embedded Operating Systems 55
编译并运行 编译 ???? 6/13/2021 Embedded Operating Systems 56
使用gdb调试bug 运行bug 输入字符串hello 显示出错位置 6/13/2021 Embedded Operating Systems 57 能不能看到源代码呢?
使用gcc的-g参数 v gcc –g –o bug. c v 重新调试 列出源代码 6/13/2021 Embedded Operating Systems 58
设置断点 ?怎么修改前面的源代码呢? 6/13/2021 Embedded Operating Systems 59
v 规则一般形式 target. . . : prerequisites. . . <tab>command <tab>. . . v 例如 test: test. c; gcc –O –o test. c 6/13/2021 Embedded Operating Systems 65
一个简单的makefile edit : main. o kbd. o command. o display. o insert. o search. o files. o utils. o cc -o edit main. o kbd. o command. o display. o insert. o search. o files. o utils. o main. o : main. c defs. h cc -c main. c kbd. o : kbd. c defs. h command. h cc -c kbd. c command. o : command. c defs. h command. h cc -c command. c display. o : display. c defs. h buffer. h cc -c display. c insert. o : insert. c defs. h buffer. h cc -c insert. c search. o : search. c defs. h buffer. h cc -c search. c files. o : files. c defs. h buffer. h command. h cc -c files. c utils. o : utils. c defs. h cc -c utils. c clean : rm edit main. o kbd. o command. o display. o insert. o utils. o 6/13/2021 search. o files. o Embedded Operating Systems 66
Make的 作过程 v default goal 在缺省的情况下,make从makefile中的第一个目 标开始执行 v Make的 作过程类似一次深度优先遍历过程 6/13/2021 Embedded Operating Systems 67
Makefile 中的变量 v 使用变量可以 Ø 降低错误风险 Ø 简化makefile v 例:objects变量($(objects)) objects = main. o kbd. o command. o display. o insert. o search. o files. o utils. o edit : $(objects) cc -o edit $(objects) 6/13/2021 Embedded Operating Systems 68
预定义变量 v Make使用了许多预定义的变量,如 Ø AR Ø AS Ø CC Ø CXX Ø CFLAGS Ø CPPFLAGS Ø 等等 6/13/2021 Embedded Operating Systems 70
简化后的makefile文件 objects = main. o kbd. o command. o display. o insert. o search. o files. o utils. o edit : $(objects) cc -o edit $(objects) main. o : defs. h kbd. o : defs. h command. h display. o : defs. h buffer. h insert. o : defs. h buffer. h search. o : defs. h buffer. h files. o : defs. h buffer. h command. h utils. o : defs. h. PHONY : clean : rm edit $(objects) 6/13/2021 Embedded Operating Systems 71
Makefile中的函数 (Functions) v 用来计算出要操作的文件、目标或者要执行的命 令 v 使用方法: Ø $(function arguments) v 典型的函数 Ø $(subst from, to, text) l $(subst ee, EE, feet on the street) l 相当于`f. EEt on the str. EEt' 6/13/2021 Embedded Operating Systems 76
v $(patsubst pattern, replacement, text) Ø $(patsubst %. c, %. o, x. c. c bar. c) Ø 相当于`x. c. o bar. o‘ v $(wildcard pattern) Ø $(wildcard *. c) Ø objects : = $(wildcard *. o) 6/13/2021 Embedded Operating Systems 77
makefile中的条件语句 conditional-directive text-if-true endif or conditional-directive text-if-true else text-if-false endif 6/13/2021 Embedded Operating Systems 78
四种条件语句 v ifeq. . . else. . . endif v ifneq…else…endif v ifndef. . . else…endif 6/13/2021 Embedded Operating Systems 79
实际项目中的makefile v 找到Linux或者u. Clinux源代码中所有的makefile, 分析它们的功能、相互关系。 6/13/2021 Embedded Operating Systems 80
ld使用举例(1) v 源程序 v 编译hello. c到hello. o Ø 命令:gcc -c hello. c 6/13/2021 Embedded Operating Systems 82
ld使用举例(2) v 链接 Ø 命令:ld –dynamic-linker /lib/ld-linux. so. 2 /usr/lib/crt 1. o /usr/lib/crti. o /usr/lib/crtn. o hello. o –lc –o hello v 运行. /hello 6/13/2021 Embedded Operating Systems 83
v 使用objdump查看目标文件的信息 Ø objdump –h hello. o Ø 比较hello 6/13/2021 Embedded Operating Systems 85
常用的命令 v INCULDE filename 包含其他filename的链接描述文件 v INPUT(file, …) 指定多个输入文件名 6/13/2021 Embedded Operating Systems 90
常用的命令 v OUTPUT_FORMAT(bfdname) 指定输出文件的格式 v OUTPUT_ARCH ( bfdname ) Ø 指定目标机器体系结构,例如: OUTPUT_ARCH(arm) 6/13/2021 Embedded Operating Systems 91
Memory举例 6/13/2021 Embedded Operating Systems 93
定义输出节 § SECTIONS {. . . secname : { contents }. . . } v 例如: 6/13/2021 Embedded Operating Systems 95
定位计数器 v 定位计数器,The Location Counter Ø 一个特殊的ld变量,使用“. ”表示 Ø 总是在SECTIONS中使用 Ø 例如: 6/13/2021 Embedded Operating Systems 96
一个简单例子 v 下面是一个简单的例子: 例中,输出文件包含text,data,bss三个节,而输入文件也只 包含这 3个节: SECTIONS {. =0 x 01000000; . text: {*(. text)}; . =0 x 08000000; . data: {*(. data)}; . bss: {*(. bss)}; } 6/13/2021 Embedded Operating Systems 97
SECTIONS举例(对应于上面的MEMORY 例子) 6/13/2021 Embedded Operating Systems 98
Snapgear 3. 4. 0,arm版linux v 链接描述文件 Ø Vmlinux:arch/$(ARCH)/kernel/vmlinux. lds Ø 制作压缩版映像时 linux/arch/arm/boot/compressed/vmlinux. lds Ø 制作bootp时 linux/arch/arm/bootp/bootp. lds 6/13/2021 Embedded Operating Systems 99
一个可行的GNU tools与 Linux内核之间关系表 6/13/2021 Embedded Operating Systems 102
安装现成的二进制交叉环境 v 下载arm-elf-tools的最新版本或合适的版本 如:arm-elf-tools-20030314. sh Ø 地址:http: //www. uclinux. org/pub/u. Clinux/arm-elftools/arm-elf-tools-20030314. sh 或者:http: //ftp. snapgear. org/pub/snapgear/tools/armelf/arm-elf-tools-20030314. sh Ø… v 安装 Ø 在root权限下运行 l sh. /arm-elf-tools-20030314. sh 这个命令会在开发主机上自动建立一个u. Clinux-ARM的交叉 编译环境 6/13/2021 Embedded Operating Systems 105
安装成功? v 检查一下(演示) Ø 对 arm-elf运用shell的tab功能可以看到一系列arm-elf打 头的程序,如 l binutils系列、gcc、gdb等等 Ø 运行arm-elf-gcc –v 6/13/2021 Embedded Operating Systems 106
6/13/2021 Embedded Operating Systems 107
Thanks! The end.
- Slides: 109