1、第第7章嵌入式章嵌入式Linux开发环开发环境境2022-8-12第7章嵌入式Linux开发环境第1页,共28页。第7章 嵌入式Linux开发环境7.1 GNU Tools7.2 项目管理7.3 调试器第7章嵌入式Linux开发环境第2页,共28页。7.1 GNU ToolspGNU Tools综述pGCC 编译与链接pGCC 工具介绍pC语言库pELF文件格式第7章嵌入式Linux开发环境第3页,共28页。GNU Tools综述 GNU Tools是Linux环境下的开发工具,用于代码的生成。GNU Tools的重要组成部分是GCC。GCC 是GNU Compiler Collection
2、的缩写,是一个非常优秀的跨平台编译器集合,支持x86、ARM、MIPS 和PowerPC 等多种目标平台,支持C、C+、Java、ADA、Fortran 和Pascal 等多种高级语言。第7章嵌入式Linux开发环境第4页,共28页。GNU Tools综述文件类型扩展名文件说明文本文件*.c C语言源文件*.C/*.cxx/*.ccC+语言源文件*.i预处理后的C语言源文件*.ii预处理后的C+语言源文件*.s*.S汇编语言*.h头文件二进制文件.o目标文件.so动态库.a静态库第7章嵌入式Linux开发环境第5页,共28页。GNU Tools综述工具名称说明asGNU汇编器。用以将处理器的汇
3、编代码转换成可执行代码,并存储到目标文件.o文件中ldGNU链接器。用于将一个或多个目标文件.o、库组合成一个可执行程序;或者生成静态库和动态库。ar归档工具,可以将多个文件组合成一个大文件,并且可以读取原始文件的内容。stripe去除文件中的符号nm用以显示目标文件中的符号objectcopy转换二进制代码的工具objdump显示目标文件的反汇编工具readelf显示ELF文件中的各种信息string显示文件中的可打印字符ranlib产生归档文件的系引,并将其保存到归档文件中,系引同时列出归档文件各成员所定义的可重分配目标文件。addr2line可以将一个可执行程序的地址映射到源文件的对应行
4、。Gprof显示程序调用段的各种数据第7章嵌入式Linux开发环境第6页,共28页。GNU Tools综述 GNU Tools是Linux环境下的开发工具,用于代码的生成。GNU Tools的重要组成部分是GCC。GCC 是GNU Compiler Collection 的缩写,是一个非常优秀的跨平台编译器集合,支持x86、ARM、MIPS 和PowerPC 等多种目标平台,支持C、C+、Java、ADA、Fortran 和Pascal 等多种高级语言。第7章嵌入式Linux开发环境第7页,共28页。GNU Tools综述p 预处理预处理p 编译编译 p 汇编汇编p 链接链接第7章嵌入式Lin
5、ux开发环境第8页,共28页。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 int main(void)printf(Hello world!n);return 0;第7章嵌入式Linux开发环境第9页,共28页。GCC 编译与链接一步完成:一步完成:#gcc foo1.c foo2.c-o foo源程序:源
6、程序: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第7章嵌入式Linux开发环境第10页,共28页。归档工具ar ar 工具用于建立、修改、提取归档文件(archive)。一个归档文件是包含多个文件的单个文件(也可以把它认为是一个库文件),其结构保证了可以从中检索并得到原始的被包含文件(称做此归档文件的成员)。被包含的原始文件的内容、模式(权限)、时间戳、所有者和组等属性都保存在归档文件中,并且可在提取后,恢复原始文件的相关属性。ar-p mod relpo
7、s archive member.第7章嵌入式Linux开发环境第11页,共28页。移除符号工具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=symboln
8、ame-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-helpobjfile.第7章嵌入式Linux开发环境第12页,共28页。列出文件符号工具nm nm工具的功能是列出目标文件中的符号,这样可以帮助程序员分析可执行程序,获得目标文件中的符号信息和它的属性。nm -a|-debug-syms -g|-extern-on
9、ly -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
10、.第7章嵌入式Linux开发环境第13页,共28页。目标文件复制工具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
11、-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 -debugg
12、ing -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|-v
13、ersion -help input-file outfile第7章嵌入式Linux开发环境第14页,共28页。目标文件信息工具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|-s
14、ection-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-a
15、ddresses -noshow-raw-insn -adjust-vma=offset -version -help object-file.第7章嵌入式Linux开发环境第15页,共28页。C语言库 在嵌入式程序的C语言程序的开发中,C语言库是应用程序所依赖的基础。在C语言库中,提供一些C语言中程序运行的基础,包括标准的库函数,如:printf、malloc、字符串处理等基本函数操作。第7章嵌入式Linux开发环境第16页,共28页。ELF文件格式 ELF(Executable and Linking Format,可执行链接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Ap
16、plication Binary Interface,ABI)而开发和发布的。工具接口标准委员会(TIS)选择了正在发展中的ELF标准作为工作在32位INTEL体系上不同操作系统之间可移植的二进制文件格式。ELF文件格式包括三种主要的类型:p 可执行文件p 可重定向文件(*.o)p 共享库(*.so)第7章嵌入式Linux开发环境第17页,共28页。ELF文件格式 ELF文件从链接器(linker)的角度看,是一些节(sections)的集合;从程序装载器(loader)的角度看,它是一些段(segments)的集合。ELF格式的程序和共享库具有相同的结构,只是段的集合和节的集合上有些不同。第
17、7章嵌入式Linux开发环境第18页,共28页。7.2项目管理p工程管理工具Make与Makefilep版本控制第7章嵌入式Linux开发环境第19页,共28页。工程管理工具Make与Makefile/*main.c*/#include hello.hint main(int argc,char*argv)hello(argc,argv);return 0;/*hello.c*/#include int hello(int argc,char*argv)int i;printf(Hello world!n);for(i=0;i argc;i+)printf(argv%d=%sn,i,argvi
18、);return 0;/*hello.h*/int hello(int argc,char*argv);第7章嵌入式Linux开发环境第20页,共28页。工程管理工具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
19、$(TT)第7章嵌入式Linux开发环境第21页,共28页。工程管理工具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指定本工程所有的目标文件,在
20、后面的规则$(TT):$(OBJS)使用;TT:=hello工程最终需要得到的可执行文件INC =.包含头文件,本工程只包含了当前路径.CFLAGS=-pipe-w-I$(INC)编译选项,在语句$(CC)$(CFLAGS)-c$-o$中使用LDFLAGS=-Wall 链接选项,在语句$(CC)$(LDFLAGS)$(OBJS)-o$中使用第7章嵌入式Linux开发环境第22页,共28页。版本控制 CVS是一种广泛应用的、开源的、透明于网络、程序代码版本的分合控制。明于网络的版本控制系统。CVS支持程序代码版本的储存与维护、程序代码版本的追踪回溯、支持多人合作开发项目等。不过这个广为使用的版本
21、控制工具还有不少问题,包括中文支持和二进制文件的处理都有或多或少的问题。SVN的出现改变了这一现状。SVN保留大多数CVS 特性,而且进一步支持更多的特性,包括版本化管理目录、重命名和文件meta-data、提交是真实的原子操作、可以通过WebDAV/DeltaV协议进行访问、可以选择独立服务器模式、分支和标签是代价低廉(固定不变的)的操作、高效处理二进制文件等。第7章嵌入式Linux开发环境第23页,共28页。7.3 调试器pGDB调试基础p远程GDB调试第7章嵌入式Linux开发环境第24页,共28页。GDB调试基础 GDB是一个强大的命令行调试工具。命令行的强大就是在于其可以形成执行序列
22、,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。调试方法:#gdb hello使用gdb启动被调试的程序。第7章嵌入式Linux开发环境第25页,共28页。GDB调试基础 GDB调试主要使用的语法为:break 在程序中设置端点 clear 清除所有的已定义的停止点。info 显示相关的信息,如地址、寄存器、栈信息、输入参数等next 执行下一行,但是不进入函数,相当于step overstep 执行下一行,进入函数,相当于step inrun 执行当前调试
23、的程序,可以加参数quit 退出GDB第7章嵌入式Linux开发环境第26页,共28页。远程GDB调试 在远程GDB调试的中,调试器是运行在主机的应用程序,被调试的程序是运行在target上。使用插桩(stub)在目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。调试器与被调程序的通信:GDB和调试stub通过GDB串行协议进行通信。指定通信端口(串口、并口和网卡)遵循远程调试协议进行通信。GDB串行协议是一种基于消息的ASCII码协议,包含了诸如读写内存、查询寄存器、运行程序等命令。第7章嵌入式Linux开发环境第27页,共28页。2022-8-12第7章嵌入式Linux开发环境第28页,共28页。