第 7 章 嵌入式 linux 开发环境

28
第 7 第 第第第 Linux 第第第第

Upload: conroy

Post on 17-Mar-2016

118 views

Category:

Documents


9 download

DESCRIPTION

第 7 章 嵌入式 Linux 开发环境. 第 7 章 嵌入式 Linux 开发环境. 7.1 GNU Tools 7.2 项目管理 7.3 调试器. 7.1 GNU Tools. GNU Tools 综述 GCC 编译与链接 GCC 工具介绍 C 语言库 ELF 文件格式. GNU Tools 综述. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 7 章 嵌入式 Linux 开发环境

第 7 章 嵌入式 Linux 开发环境

Page 2: 第 7 章 嵌入式 Linux 开发环境

第 7 章 嵌入式 Linux 开发环境 7.1 GNU Tools 7.2 项目管理 7.3 调试器

Page 3: 第 7 章 嵌入式 Linux 开发环境

7.1 GNU Tools

GNU Tools 综述 GCC 编译与链接 GCC 工具介绍 C 语言库 ELF 文件格式

Page 4: 第 7 章 嵌入式 Linux 开发环境

GNU Tools 综述 GNU Tools是 Linux环境下的开发工具,用于代码的生成。 GNU Tools的重要组成部分是 GCC。 GCC 是 GNU Compiler Collection 的缩写,是一个非常优秀的跨平台编译器集合,支持 x86、 ARM、MIPS 和 PowerPC 等多种目标平台,支持 C、 C++、 Java、 ADA、Fortran 和 Pascal 等多种高级语言。

Page 5: 第 7 章 嵌入式 Linux 开发环境

GNU Tools 综述文件类型 扩展名 文件说明文本文件 *.c C语言源文件

*.C / *.cxx / *.cc C++语言源文件*.i 预处理后的 C语言源文件*.ii 预处理后的 C++语言源文件*.s *.S 汇编语言*.h 头文件

二进制文件 .o 目标文件.so 动态库.a 静态库

Page 6: 第 7 章 嵌入式 Linux 开发环境

GNU Tools 综述工具名称 说明

as GNU汇编器。用以将处理器的汇编代码转换成可执行代码,并存储到目标文件 .o文件中ld GNU链接器。用于将一个或多个目标文件 .o、库组合成一个可执行程序;或者生成静态库和动态库。ar 归档工具,可以将多个文件组合成一个大文件,并且可以读取原始文件的内容。stripe 去除文件中的符号nm 用以显示目标文件中的符号objectcopy 转换二进制代码的工具objdump 显示目标文件的反汇编工具readelf 显示 ELF文件中的各种信息string 显示文件中的可打印字符ranlib 产生归档文件的系引,并将其保存到归档文件中,系引同时列出归档文件各成员所定义的可重分配目标文件。addr2line 可以将一个可执行程序的地址映射到源文件的对应行。Gprof 显示程序调用段的各种数据

Page 7: 第 7 章 嵌入式 Linux 开发环境

GNU Tools 综述 GNU Tools是 Linux环境下的开发工具,用于代码的生成。 GNU Tools的重要组成部分是 GCC。 GCC 是 GNU Compiler Collection 的缩写,是一个非常优秀的跨平台编译器集合,支持 x86、 ARM、MIPS 和 PowerPC 等多种目标平台,支持 C、 C++、 Java、 ADA、Fortran 和 Pascal 等多种高级语言。

Page 8: 第 7 章 嵌入式 Linux 开发环境

GNU Tools 综述*.c源文件

*.i预处理文件

*.s汇编文件

*.o目标文件

预处理-E

汇编-c(调用as)

*.o目标文件

预处理+编译+汇编

-c

链接(调用ld)

...

编译成汇编语言-S

可执行程序、库

编译成汇编语言-S

预处理+编译+汇编

-c

预处理 编译 汇编 链接

Page 9: 第 7 章 嵌入式 Linux 开发环境

GCC 编译与链接

# gcc hello.c -o hello# ./helloHello world!

预处理# gcc -E hello.c -o hello.i编译和汇编# gcc -c hello.i -o hello.o链接# gcc hello.o -o hello

一步完成: 分布完成:

/* hello.c */#include <stdio.h>int main(void){ printf ("Hello world!\n" ); return 0;}

Page 10: 第 7 章 嵌入式 Linux 开发环境

GCC 编译与链接

一步完成:# gcc foo1.c foo2.c -o foo

源程序: foo1.c foo2.c

多步完成:# gcc -c foo1.c -o foo1.o# gcc -c foo2.c -o foo2.o# gcc foo1.o foo2.o -o foo

Page 11: 第 7 章 嵌入式 Linux 开发环境

归档工具 ar

ar 工具用于建立、修改、提取归档文件( archive )。一个归档文件是包含多个文件的单个文件 ( 也可以把它认为是一个库文件 ) ,其结构保证了可以从中检索并得到原始的被包含文件(称做此归档文件的成员)。被包含的原始文件的内容、模式(权限)、时间戳、所有者和组等属性都保存在归档文件中,并且可在提取后,恢复原始文件的相关属性。

ar [-] p[ mod [ relpos]] archive [ member ...]

Page 12: 第 7 章 嵌入式 Linux 开发环境

移除符号工具 strip

strip 工具用于去除文件中的符号。使用 strip 既可以移除目标中文件中的某个符号,也可以移除整个节。使用strip ,至少要有一个输入文件,也可以输入一个文件列表。

strip [-F bfdname |--target=bfdname ][-I bfdname |--input-target=bfdname ][-O bfdname |--output-target=bfdname ][-s|--strip-all] [-S|-g|-d|--strip-debug][-K symbolname |--keep-symbol=symbolname ][-N symbolname |--strip-symbol=symbolname ][-x|--discard-all ] [-X |--discard-locals][-R sectionname |--remove-section=sectionname ][-o file ] [-p|--preserve-dates][-v |--verbose] [-V|--version] [--help]objfile...

Page 13: 第 7 章 嵌入式 Linux 开发环境

列出文件符号工具 nm

nm 工具的功能是列出目标文件中的符号,这样可以帮助程序员分析可执行程序,获得目标文件中的符号信息和它的属性。 nm [ -a | --debug-syms ] [ -g | --extern-only ][ -B ] [ -C | --demangle ] [ -D | --dynamic ][ -s | --print-armap ] [ -A | -o | --print-file-name ][ -n | -v | --numeric-sort ] [ -p | --no-sort ][ -r | --reverse-sort ] [ --size-sort ] [ -u | --undefined-only ][-t radix | --radix= radix ] [ -P | --portability ][ --target= bfdname ] [-f format | --format= format ][ --defined-only ] [ -l | --line-numbers ][ --no-demangle ] [ -V | --version ][ --help ][ object-file ...]

Page 14: 第 7 章 嵌入式 Linux 开发环境

目标文件复制工具 objcopy

objcopy 工具用来把某种格式的目标文件内容进行转换,并输出为另一种格式的目标文件。 objcopy 使用 GNU BFD 库读写目标文件,通过这个 BFD 库, objcopy 能够以一种不同于源目标文件的格式来生成目标文件。objcopy [ -F bfdname | --target= bfdname ] [ -I bfdname | --input-target=bfdname ][ -O bfdname | --output-target= bfdname ] [ -S | --strip-all ] [ -g | --strip-debug ][ -K symbolname | --keep-symbol= symbolname ] [ -N symbolname | --strip-symbol= symbolname ][ -L symbolname | --localize-symbol= symbolname ] [ -W symbolname | --weaken-symbol= symbolname ][ -x | --discard-all ] [ -X | --discard-locals ] [ -b byte | --byte= byte ][ -i interleave | --interleave= interleave ] [ -R sectionname | --remove-section= sectionname ][ -p | --preserve-dates ] [ --debugging ] [ --gap-fill= val ] [ --pad-to= address ][ --set-start= val ] [ --adjust-start= incr ] [ --change-address= incr ][ --change-section-address= section{=,+,-} val ] [ --change-warnings ] [ --no-change-warnings ][ --set-section-flags= section= flags ] [ --add-section= sectionname= filename ][ --change-leading char ] [--remove-leading-char ] [ --weaken ][ -v | --verbose ] [ -V | --version ] [ --help ] input-file [ outfile]

Page 15: 第 7 章 嵌入式 Linux 开发环境

目标文件信息工具 objdump

objdump 工具用于显示一个或多个目标文件的信息。由其选项来控制显示哪些特定的信息。

objdump [ -a | --archive-headers ][ -b bfdname | --target= bfdname ] [ --debugging ][ -C | --demangle ] [ -d | --disassemble ] [ -D | --disassemble-all ] [ --disassemble-zeroes ][ -EB | -EL | --endian={big | little } ] [ -f | --file-headers ][ -h | --section-headers | --headers ] [ -i | --info ] [ -j section | --section= section ][ -l | --line-numbers ] [ -S | --source ] [ -m machine | --architecture= machine ][ -p | --private-headers] [ -r | --reloc ] [ -R | --dynamic-reloc ][ -s | --full-contents ] [ --stabs ] [ -t | --syms ] [ -T | --dynamic-syms ] [ -x | --all-headers ][ -w | --wide ] [ --start-address= address ][ --stop-address= address ][ --prefix-addresses] [ --[no]show-raw-insn ][ --adjust-vma= offset ][ --version ] [ --help ][ object-file...]

Page 16: 第 7 章 嵌入式 Linux 开发环境

C语言库

在嵌入式程序的 C 语言程序的开发中, C 语言库是应用程序所依赖的基础。在 C 语言库中,提供一些 C 语言中程序运行的基础,包括标准的库函数,如: printf 、 malloc 、字符串处理等基本函数操作。 Linux内核

硬件

C语言库

应用程序

驱动程序

系统调用接口

Page 17: 第 7 章 嵌入式 Linux 开发环境

ELF 文件格式 ELF ( Executable and Linking Format ,可执行链接格式)是 UNIX 系统实验室( USL )作为应用程序二进制接口( Application Binary Interface , ABI )而开发和发布的。工具接口标准委员会 (TIS) 选择了正在发展中的 ELF 标准作为工作在 32 位 INTEL 体系上不同操作系统之间可移植的二进制文件格式。 ELF 文件格式包括三种主要的类型:

可执行文件 可重定向文件( *.o ) 共享库( *.so )

Page 18: 第 7 章 嵌入式 Linux 开发环境

ELF 文件格式 ELF 文件从链接器( linker )的角度看,是一些节( sections )的集合;从程序装载器( loader )的角度看,它是一些段( segments )的集合。 ELF 格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。

Elf 头

Program header table编程头部表(可选)

section 1(节1)

section n(节n)

……

Section header table(节头部表)

Elf 头

Program header table编程头部表

Segment 1(段1)

Segment 2(节2)

Section header table(节头部表,可选)

…… ……

链接角度 运行角度

Page 19: 第 7 章 嵌入式 Linux 开发环境

7.2项目管理

工程管理工具Make与Makefile 版本控制

Page 20: 第 7 章 嵌入式 Linux 开发环境

工程管理工具Make与Makefile

/* main.c */#include "hello.h"int main (int argc,char* argv[]){ hello(argc,argv); return 0;}/* hello.c */#include <stdio.h>int hello(int argc,char* argv[]){ int i; printf ("Hello world!\n"); for(i = 0;i < argc; i++) printf("argv[%d] = %s\n",i,argv[i]); return 0;}/* hello.h */int hello(int argc,char* argv[]);

Page 21: 第 7 章 嵌入式 Linux 开发环境

工程管理工具Make与Makefile

# MakefileCC := gccHEAD := hello.hSRC := hello.c main.c OBJS := hello.o main.oTT := helloINC = .CFLAGS = -pipe -w -I$(INC)LDFLAGS = -Wallall:$(TT)

$(TT):$(OBJS)$(CC) $(LDFLAGS) $(OBJS) -o $@

%.o:%c$(CC) $(CFLAGS) -c $< -o $@

clean:

rm -f *.o $(TT)

Page 22: 第 7 章 嵌入式 Linux 开发环境

工程管理工具Make与Makefile

# makegcc -pipe -w -I. -c -o hello.o hello.cgcc -pipe -w -I. -c -o main.o main.cgcc -Wall hello.o main.o -o hello# make cleanrm -f *.o hello

变量定义 含义CC := gcc 指定编译使用的工具,本编译的目标为 x86的体系可执行文件,因此使用 gcc,如果需要变异 arm体系的可执行文件,需要将 gcc更改为 arm-linux-gcc;OBJS := hello.o main.o 指定本工程所有的目标文件,在后面的规则 $(TT):$(OBJS)使用;TT := hello 工程最终需要得到的可执行文件INC = . 包含头文件,本工程只包含了当前路径 .CFLAGS = -pipe -w -I$(INC) 编译选项,在语句 $(CC) $(CFLAGS) -c $< -o $@中使用LDFLAGS = -Wall 链接选项,在语句 $(CC)$(LDFLAGS) $(OBJS) -o $@中使用

Page 23: 第 7 章 嵌入式 Linux 开发环境

版本控制 CVS 是一种广泛应用的、开源的、透明于网络 、程序代码版本的分合控制。明于网络的版本控制系统。 CVS支持程序代码版本的储存与维护、程序代码版本的追踪回溯、支持多人合作开发项目等。不过这个广为使用的版本控制工具还有不少问题,包括中文支持和二进制文件的处理都有或多或少的问题。 SVN 的出现改变了这一现状。 SVN 保留大多数 CVS 特性 , 而且进一步支持更多的特性,包括版本化管理目录、重命名和文件 meta-data 、提交是真实的原子操作、可以通过 WebDAV/DeltaV协议进行访问、可以选择独立服务器模式、分支和标签是代价低廉(固定不变的)的操作、高效处理二进制文件等。

Page 24: 第 7 章 嵌入式 Linux 开发环境

7.3 调试器

GDB调试基础 远程 GDB调试

Page 25: 第 7 章 嵌入式 Linux 开发环境

GDB调试基础 GDB 是一个强大的命令行调试工具。命令行的强大就是在于其可以形成执行序列,形成脚本。 UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。调试方法:# gdb hello使用 gdb启动被调试的程序。

Page 26: 第 7 章 嵌入式 Linux 开发环境

GDB调试基础 GDB调试主要使用的语法为:break 在程序中设置端点 clear 清除所有的已定义的停止点。info 显示相关的信息,如地址、寄存器、栈信息、输入参数等next 执行下一行,但是不进入函数,相当于 step overstep 执行下一行,进入函数,相当于 step inrun 执行当前调试的程序,可以加参数quit 退出 GDB

Page 27: 第 7 章 嵌入式 Linux 开发环境

远程 GDB调试

在远程 GDB调试的中,调试器是运行在主机的应用程序, 被调试的程序是运行在 target 上。使用插桩 (stub) 在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。 调试器与被调程序的通信: GDB 和调试 stub通过 GDB 串行协议进行通信。指定通信端口(串口、并口和网卡)遵循远程调试协议进行通信。 GDB 串行协议是一种基于消息的 ASCII码协议,包含了诸如读写内存、查询寄存器、运行程序等命令。

Page 28: 第 7 章 嵌入式 Linux 开发环境

课程结束