1 / 28

第 7 章 嵌入式 Linux 开发环境

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

conroy
Télécharger la présentation

第 7 章 嵌入式 Linux 开发环境

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

  5. GNU Tools综述

  6. GNU Tools综述

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

  8. GNU Tools综述 • 预处理 • 编译 • 汇编 • 链接

  9. GCC 编译与链接 /* hello.c */ #include <stdio.h> int main(void) { printf ("Hello world!\n" ); return 0; } 分布完成: 一步完成: 预处理 # gcc -E hello.c -o hello.i 编译和汇编 # gcc -c hello.i -o hello.o 链接 # gcc hello.o -o hello # gcc hello.c -o hello # ./hello Hello world!

  10. GCC 编译与链接 源程序: foo1.c foo2.c 一步完成: # gcc foo1.c foo2.c -o foo 多步完成: # gcc -c foo1.c -o foo1.o # gcc -c foo2.c -o foo2.o # gcc foo1.o foo2.o -o foo

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

  12. 移除符号工具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...

  13. 列出文件符号工具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 ...]

  14. 目标文件复制工具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]

  15. 目标文件信息工具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...]

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

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

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

  19. 7.2项目管理 • 工程管理工具Make与Makefile • 版本控制

  20. 工程管理工具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[]);

  21. 工程管理工具Make与Makefile # Makefile CC := gcc HEAD := hello.h SRC := hello.c main.c OBJS := hello.o main.o TT := hello INC = . CFLAGS = -pipe -w -I$(INC) LDFLAGS = -Wall all:$(TT) $(TT):$(OBJS) $(CC) $(LDFLAGS) $(OBJS) -o $@ %.o:%c $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f *.o $(TT)

  22. 工程管理工具Make与Makefile # make gcc -pipe -w -I. -c -o hello.o hello.c gcc -pipe -w -I. -c -o main.o main.c gcc -Wall hello.o main.o -o hello # make clean rm -f *.o hello

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

  24. 7.3 调试器 • GDB调试基础 • 远程GDB调试

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

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

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

  28. 课程结束

More Related