




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系统陈香兰xlanchen@助教:陈博、李春华嵌入式操作系统陈香兰GNU开发工具链介绍
“工欲善其事,必先利其器”--《论语》GNU开发工具链介绍 主要内容GNUTools简介GNUTools交叉开发环境及其安装9/2/20233EmbeddedOperatingSystems主要内容GNUTools简介8/3/20233Embedd本地开发vs交叉平台开发本地开发:
一般软件的开发属于本地开发,也就是说开发软件的系统与运行软件的系统是相同的。交叉平台开发:
本课程所涉及到的嵌入式系统开发属于交叉平台开发,也就是说开发软件的系统与运行软件的系统不同。9/2/20234EmbeddedOperatingSystems本地开发vs交叉平台开发本地开发:
一般软件的开发属于本交叉开发平台主机:
开发软件的平台,称为主机,往往是通用电脑;目标机:
运行软件的平台,称为目标机,在这里是嵌入式系统。9/2/20235EmbeddedOperatingSystems交叉开发平台主机:
开发软件的平台,称为主机,往往是通用电脑嵌入式交叉开发工具掌握嵌入式开发工具的使用是进行嵌入式开发的前提条件之一与主流开发工具类似,嵌入式交叉开发工具也包括编译器,即能够把一个源程序编译生成一个可执行程序的软件调试工具,即能够对执行程序进行源码或汇编级调试的软件软件工程工具,用于协助多人开发或大型软件项目的管理的软件9/2/20236EmbeddedOperatingSystems嵌入式交叉开发工具掌握嵌入式开发工具的使用是进行嵌入式开发的GNUtoolsGNUtools和其他一些优秀的开源软件可以完全覆盖上述类型的软件开发工具。为了更好的开发嵌入式系统,需要熟悉如下一些软件GCCBinutils—辅助GCC的主要软件Gdbmakecvs9/2/20237EmbeddedOperatingSystemsGNUtoolsGNUtools和其他一些优秀的开源软件一、GCC很多人认为GCC只是一个C编译器,
其实GCC=GNUCompilerCollection目前,GCC可以支持多种高级语言,如C、C++ADAObjectCJAVAFortranPASCAL9/2/20238EmbeddedOperatingSystems一、GCC很多人认为GCC只是一个C编译器,
其实GCC=GCC下的工具cpp—预处理器
GNUC编译器在编译前自动使用cpp对用户程序进行预处理gcc—符合ISO等标准的C编译器g++—基本符合ISO标准的C++编译器gcj—GCC的java前端gnat—GCC的GNUADA95前端9/2/20239EmbeddedOperatingSystemsGCC下的工具cpp—预处理器
GNUC编译器在编译前GNUTools—gccgcc是一个强大的工具集合,它包含了预处理器、编译器、汇编器、链接器等组件。它会在需要的时候调用其他组件。
输入文件的类型和传递给gcc的参数决定了gcc调用具体的哪些组件。对于开发者,它提供的足够多的参数,可以让开发者全面控制代码的生成,这对嵌入式系统级的软件开发非常重要9/2/202310EmbeddedOperatingSystemsGNUTools—gccgcc是一个强大的工具集合,它包含gcc使用举例(1)
源程序9/2/202311EmbeddedOperatingSystemsgcc使用举例(1)
源程序8/3/202311Embeddgcc使用举例(2)
编译和运行编译运行9/2/202312EmbeddedOperatingSystemsgcc使用举例(2)
编译和运行编译运行8/3/202312gcc的工作过程(1)如果使用-v选项,则可以看到许多被隐藏的信息9/2/202313EmbeddedOperatingSystemsgcc的工作过程(1)如果使用-v选项,则可以看到许多被隐藏9/2/202314EmbeddedOperatingSystems8/3/202314EmbeddedOperatingSgcc的编译过程一般情况下,c程序的编译过程为1、预处理2、编译成汇编代码3、汇编成目标代码4、链接9/2/202315EmbeddedOperatingSystemsgcc的编译过程一般情况下,c程序的编译过程为8/3/2021、预处理预处理:使用-E参数
输出文件的后缀为“.cpp” gcc–E–ogcctest.cppgcctest.c使用wc命令比较预处理后的文件与源文件,可以看到两个文件的差异9/2/202316EmbeddedOperatingSystems1、预处理预处理:使用-E参数
输出文件的后缀为“.cpp”行数单词数字节数预编译9/2/202317EmbeddedOperatingSystems行数单词数字节数预编译8/3/202317Embedde预处理文件汇编代码
1)使用-x参数说明根据指定的步骤进行工作,cpp-output指明从预处理得到的文件开始编译
2)使用-S说明生成汇编代码后停止工作gcc–xcpp-output–S–ogcctest.sgcctest.cpp也可以直接编译到汇编代码 gcc–Sgcctest.c2、编译成汇编代码9/2/202318EmbeddedOperatingSystems预处理文件汇编代码
1)使用-x参数说明根据指定的步骤进行预处理文件汇编代码直接编译到汇编代码s9/2/202319EmbeddedOperatingSystems预处理文件汇编代码直接编译到汇编代码s8/3/2023193、编译成目标代码汇编代码目标代码 gcc–xassembler–cgcctest.s直接编译成目标代码 gcc–cgcctest.c使用汇编器生成目标代码as–ogcctest.ogcctest.s9/2/202320EmbeddedOperatingSystems3、编译成目标代码汇编代码目标代码8/3/202320Em汇编代码目标代码直接编译成目标代码使用汇编器9/2/202321EmbeddedOperatingSystems汇编代码目标代码直接编译成目标代码使用汇编器8/3/2024、编译成执行代码目标代码执行代码 gcc–ogcctestgcctest.o直接生成执行代码 gcc–ogcctestgcctest.c9/2/202322EmbeddedOperatingSystems4、编译成执行代码目标代码执行代码8/3/202322Em目标代码执行代码直接生成执行代码9/2/202323EmbeddedOperatingSystems目标代码执行代码直接生成执行代码8/3/202323Embgcc的高级选项-Wall:打开所有的警告信息9/2/202324EmbeddedOperatingSystemsgcc的高级选项-Wall:打开所有的警告信息8/3/202根据警告信息检查源程序Main函数的返回值为int在函数的末尾应当返回一个值9/2/202325EmbeddedOperatingSystems根据警告信息检查源程序Main函数的返回值为int在函数的末修改源程序9/2/202326EmbeddedOperatingSystems修改源程序8/3/202326EmbeddedOperat优化编译优化编译选项有:-O0
缺省情况,不优化-O1-O2-O3等等不同程度的优化9/2/202327EmbeddedOperatingSystems优化编译优化编译选项有:不同程度的优化8/3/202327Egcc的优化编译举例(1)
考虑如下的源代码不同的优化编译选项9/2/202328EmbeddedOperatingSystemsgcc的优化编译举例(1)
考虑如下的源代码不同的优化8/3gcc的优化编译举例(2)
使用time命令统计程序的运行9/2/202329EmbeddedOperatingSystemsgcc的优化编译举例(2)
使用time命令统计程序的运行8二、GNUbinutilsbinutils是一组二进制工具程序集,是辅助GCC的主要软件,它主要包括addr2line把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。ar建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。9/2/202330EmbeddedOperatingSystems二、GNUbinutilsbinutils是一组二进制工具as是GNU汇编器,主要用来编译GNUC编译器gcc输出的汇编文件,他将汇编代码转换成二进制代码,并存放到一个object文件中,该目标文件将由连接器ld连接C++filt解码C++符号名,连接器使用它来过滤C++和Java符号,防止重载函数冲突。gprof显示程序调用段的各种数据。ld是连接器,它把一些目标和归档文件结合在一起,重定位数据,并链接符号引用,最终形成一个可执行文件。通常,建立一个新编译程序的最后一步就是调用ld。9/2/202331EmbeddedOperatingSystemsas是GNU汇编器,主要用来编译GNUC编译器gcc输出nm列出目标文件中的符号。objcopy把一种目标文件中的内容复制到另一种类型的目标文件中.objdump显示一个或者更多目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。ranlib产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。readelf显示elf格式可执行文件的信息。9/2/202332EmbeddedOperatingSystemsnm列出目标文件中的符号。8/3/202332Embeddsize列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。strings打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。strip丢弃目标文件中的全部或者特定符号。9/2/202333EmbeddedOperatingSystemssize列出目标文件每一段的大小以及总体的大小。默认情况下libiberty包含许多GNU程序都会用到的函数,这些程序有:getopt,obstack,strerror,strtol和strtoul.libbfd二进制文件描述库.libopcodes用来处理opcodes的库,在生成一些应用程序的时候也会用到它,比如objdump.Opcodes是文本格式可读的处理器操作指令.9/2/202334EmbeddedOperatingSystemslibiberty包含许多GNU程序都会用到的函数,这些binutils开发工具使用举例arnmObjcopyObjdumpreadelf9/2/202335EmbeddedOperatingSystemsbinutils开发工具使用举例ar8/3/202335Em1、arar用于建立、修改、提取归档文件(archive),一个归档文件,是包含多个被包含文件的单个文件(也可以认为归档文件是一个库文件)。被包含的原始文件的内容、权限、时间戳、所有者等属性都保存在归档文件中,并且在提取之后可以还原9/2/202336EmbeddedOperatingSystems1、arar用于建立、修改、提取归档文件(archive),使用ar建立库文件(1)源程序add.c和minus.c9/2/202337EmbeddedOperatingSystems使用ar建立库文件(1)源程序add.c和minus.c8/使用ar建立库文件(2)编译成目标文件将库文件拷贝到/usr/lib目录下Ar的rv参数的说明: r:将多个文件组成一个文件 v:输出信息建立库文件9/2/202338EmbeddedOperatingSystems使用ar建立库文件(2)编译成目标文件将库文件拷贝到/usr库文件使用举例
在代码中使用Add和Minus函数9/2/202339EmbeddedOperatingSystems库文件使用举例
在代码中使用Add和Minus函数8/3/2在编译时指定库文件指明将libtest.a链接进来运行结果9/2/202340EmbeddedOperatingSystems在编译时指定库文件指明将libtest.a链接进来运行结果82、nmnm的主要功能是列出目标文件中的符号,这样程序员就可以定位和分析执行程序和目标文件中的符号信息和它的属性9/2/202341EmbeddedOperatingSystems2、nmnm的主要功能是列出目标文件中的符号,这样程序员就可nm显示的符号类型A:符号的值是绝对值,并且不会被将来的链接所改变B:符号位于未初始化数据部分(BSS段)C:符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能以相同的名字出现。如果符号在其他地方被定义,则该文件中的这个符号会被当作引用来处理D:符号位于已初始化的数据部分T:符号位于代码部分U:符号未被定义?:符号类型未知,或者目标文件格式特殊 9/2/202342EmbeddedOperatingSystemsnm显示的符号类型A:符号的值是绝对值,并且不会被将来的链接nm使用举例如果对test可执行文件使用nm,会有什么结果呢?(作业)9/2/202343EmbeddedOperatingSystemsnm使用举例如果对test可执行文件使用nm,8/3/2023、objcopy可以将一种格式的目标文件内容进行转换,并输出为另一种格式的目标文件。它使用GNUBFD(binaryformatdescription)库读/写目标文件,通过这个BFD库,objcopy能以一种不同于源目标文件的格式生成新的目标文件$objcopy-h在makefile里面用-Obinary选项来生成原始的二进制文件,即通常说的image文件9/2/202344EmbeddedOperatingSystems3、objcopy可以将一种格式的目标文件内容进行转换,并输Objcopy使用举例使用file命令查看文件类型生成srec格式的目标文件使用file命令查看新文件的类型9/2/202345EmbeddedOperatingSystemsObjcopy使用举例使用file命令查看文件类型生成sre文件格式a.out:
assemblerandlinkeditoroutput
汇编器和链接编辑器的输出coff
commonobjectfileformat
一种通用的对象文件格式ELF
excutivelinkedfile
Linux系统所采用的一种通用文件格式,支持动态连接。ELF格式可以比COFF格式包含更多的调试信息9/2/202346EmbeddedOperatingSystems文件格式a.out:
assemblerandlink文件格式Flat
elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化
uClinux系统使用flat可执行文件格式SREC
MOTOROLAS-Recoder格式(S记录格式文件)等等9/2/202347EmbeddedOperatingSystems文件格式Flat
elf格式有很大的文件头,flat文件对文4、objdump显示一个或多个目标文件的信息,由其选项来控制显示哪些信息。一般来说,objdump只对那些要编写编译工具的程序员有帮助,但是我们通过这个工具可以方便的查看执行文件或者库文件的信息9/2/202348EmbeddedOperatingSystems4、objdump显示一个或多个目标文件的信息,由其选项来控Objdump使用举例(1)-f选项:显示文件头中的内容9/2/202349EmbeddedOperatingSystemsObjdump使用举例(1)-f选项:显示文件头中的内容8/Objdump使用举例(2)-d选项进行反汇编9/2/202350EmbeddedOperatingSystemsObjdump使用举例(2)-d选项进行反汇编8/3/2025、readelfreadelf:
显示一个或多个ELF格式的目标文件信息。9/2/202351EmbeddedOperatingSystems5、readelfreadelf:
显示一个或多个ELF格式Readelf使用举例9/2/202352EmbeddedOperatingSystemsReadelf使用举例8/3/202352Embedded三、其他GNU工具Gdb—调试器GNUmake--软件工程工具diff,patch--补丁工具CVS--版本控制系统9/2/202353EmbeddedOperatingSystems三、其他GNU工具Gdb—调试器8/3/202353Embe1、GNUToolchain—gdbGdb=GNUdebugerGNUtools中的调试器,功能强大设置断点监视、修改变量单步执行显示/修改寄存器的值堆栈查看远程调试9/2/202354EmbeddedOperatingSystems1、GNUToolchain—gdbGdb=GNUgdb使用举例源代码如下编译:gcc–obugbug.c9/2/202355EmbeddedOperatingSystemsgdb使用举例源代码如下编译:8/3/202355Embed编译并运行????编译9/2/202356EmbeddedOperatingSystems编译并运行????编译8/3/202356Embedded使用gdb调试bug
运行bug输入字符串hello显示出错位置能不能看到源代码呢?9/2/202357EmbeddedOperatingSystems使用gdb调试bug
运行bug输入字符串hello显示出错使用gcc的-g参数gcc–g–obugbug.c重新调试列出源代码9/2/202358EmbeddedOperatingSystems使用gcc的-g参数gcc–g–obugbug.c列?怎么修改前面的源代码呢?设置断点9/2/202359EmbeddedOperatingSystems?怎么修改前面的源代码呢?设置断点8/3/202359Emb2、使用GNUmake管理项目GNUmake是一种代码维护工具,在使用GNU编译器开发大型应用时,往往要使用make管理项目。如果不使用make管理项目,就必须重复使用多个复杂的命令行维护项目和生成目标代码。Make通过将命令行保存到makefile中简化了编译工作。Make的主要任务是根据makefile中定义的规则和步骤,根据各个模块的更新情况,自动完成整个软件项目的维护和代码生成工作。9/2/202360EmbeddedOperatingSystems2、使用GNUmake管理项目GNUmake是一种代码维Make可以识别出makefile中哪些文件已经被修改,并且在再次编译的时候只编译这些文件,从而提高编译的效率Make会检查文件的修改和生成时间戳,如果目标文件的修改或者生成时间戳比它的任意一个依赖文件旧,则make就执行makefile文件中描述的相应命令,以便更新目的文件只更新那些需要更新的文件,而不重新处理那些并不过时的文件9/2/202361EmbeddedOperatingSystemsMake可以识别出makefile中哪些文件已经被修改,并且特点:适合于支持多文件构成的大中型软件项目的编译,链接,清除中间文件等管理工作提供和识别多种默认规则,方便对大型软件项目的管理支持对多目录的软件项目进行递归管理对软件项目具有很好的可维护性和扩展性9/2/202362EmbeddedOperatingSystems特点:8/3/202362EmbeddedOperatinmakefileMakefile告诉make该做什么、怎么做makefile主要定义了1)依赖关系
即有关哪些文件的最新版本是依赖于哪些别的文件产生或者组成的2)需要用什么命令来产生目标文件的最新版本3)以及一些其他的功能9/2/202363EmbeddedOperatingSystemsmakefileMakefile告诉make该做什么、怎么做Makefile的规则规则
一条规则包含3个方面的内容,1)要创建的目标(文件),2)创建目标(文件)所依赖的文件列表;3)通过依赖文件创建目标文件的命令组9/2/202364EmbeddedOperatingSystemsMakefile的规则规则
一条规则包含3个方面的内容,8/规则一般形式target...:prerequisites...<tab>command
<tab>...<tab>...例如test:test.c;gcc–O–otesttest.c9/2/202365EmbeddedOperatingSystems规则一般形式8/3/202365EmbeddedOpera一个简单的makefile
edit:main.okbd.ocommand.odisplay.oinsert.osearch.ofiles.outils.occ-oeditmain.okbd.ocommand.odisplay.oinsert.o\ search.ofiles.outils.omain.o:main.cdefs.hcc-cmain.ckbd.o:kbd.cdefs.hcommand.hcc-ckbd.ccommand.o:command.cdefs.hcommand.hcc-ccommand.cdisplay.o:display.cdefs.hbuffer.hcc-cdisplay.cinsert.o:insert.cdefs.hbuffer.hcc-cinsert.csearch.o:search.cdefs.hbuffer.hcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hcc-cfiles.cutils.o:utils.cdefs.hcc-cutils.cclean: rmeditmain.okbd.ocommand.odisplay.oinsert.o\ search.ofiles.outils.o9/2/202366EmbeddedOperatingSystems一个简单的makefile
edit:main.okbMake的工作过程defaultgoal
在缺省的情况下,make从makefile中的第一个目标开始执行Make的工作过程类似一次深度优先遍历过程9/2/202367EmbeddedOperatingSystemsMake的工作过程defaultgoal
在缺省的情况下,Makefile中的变量使用变量可以降低错误风险简化makefile例:objects变量($(objects))objects=main.okbd.ocommand.o\ display.oinsert.osearch.ofiles.outils.oedit:$(objects) cc-oedit$(objects)9/2/202368EmbeddedOperatingSystemsMakefile中的变量使用变量可以8/3/202368E有点像环境变量环境变量在make过程中被解释成make的变量可以被用来贮存一个文件名列表。贮存可执行文件名。如用变量代替编译器名。贮存编译器FLAG9/2/202369EmbeddedOperatingSystems有点像环境变量8/3/202369EmbeddedOper预定义变量Make使用了许多预定义的变量,如ARASCCCXXCFLAGSCPPFLAGS等等9/2/202370EmbeddedOperatingSystems预定义变量Make使用了许多预定义的变量,如8/3/2023简化后的makefile文件
objects=main.okbd.ocommand.odisplay.o\insert.osearch.ofiles.outils.oedit:$(objects)cc-oedit$(objects)main.o:defs.hkbd.o:defs.hcommand.hcommand.o:defs.hcommand.hdisplay.o:defs.hbuffer.hinsert.o:defs.hbuffer.hsearch.o:defs.hbuffer.hfiles.o:defs.hbuffer.hcommand.hutils.o:defs.h.PHONY:cleanclean:rmedit$(objects)9/2/202371EmbeddedOperatingSystems简化后的makefile文件
objects=main.内部变量$@扩展成当前规则的目的文件名$<扩展成依赖列表中的第一个依赖文件$^扩展成整个依赖列表(除掉了里面所有重复的文件名)等等不需要括号括住例如:
CC=gcc
CFLAGS=-Wall-O-g
foo.o:foo.cfoo.hbar.h
$(CC)$(CFLAGS)-c$<-o$@9/2/202372EmbeddedOperatingSystems内部变量$@扩展成当前规则的目的文件名8/3/202372E隐含规则(ImplicitRules)内置的规则告诉make当没有给出某些命令的时候,应该怎么办。用户可以使用预定义的变量改变隐含规则的工作方式,如一个C编译的具体命令将会是:$(CC)$(CFLAGS)$(CPPFLAGS)$(TARGET_ARCH)-c$<-o$@9/2/202373EmbeddedOperatingSystems隐含规则(ImplicitRules)内置的规则8/3/设定目标(PhonyTargets)设定目标目标不是一个文件其目的是为了让一些命令得以执行使用PHONY显式声明设定目标.PHONY:clean使用设定目标实现多个目的all:prog1prog29/2/202374EmbeddedOperatingSystems设定目标(PhonyTargets)设定目标8/3/202典型的设定目标设定目的也可以用来描述一些其他的动作。例如,想把中间文件和可执行文件删除,可以在makefile里设立这样一个规则:
clean: $rm*.oexec_file前提是没有其它的规则依靠这个'clean'目的,它将永远不会被执行。但是,如果你明确的使用命令'makeclean',make会把这个目的做为它的主要目标,执行那些rm命令9/2/202375EmbeddedOperatingSystems典型的设定目标设定目的也可以用来描述一些其他的动作。例如,想Makefile中的函数(Functions)用来计算出要操作的文件、目标或者要执行的命令使用方法:$(functionarguments)典型的函数$(substfrom,to,text)$(substee,EE,feetonthestreet)相当于`fEEtonthestrEEt'9/2/202376EmbeddedOperatingSystemsMakefile中的函数(Functions)用来计算出要$(patsubst
pattern,replacement,text)$(patsubst%.c,%.o,x.c.cbar.c)相当于`x.c.obar.o‘$(wildcard
pattern)$(wildcard*.c)objects:=$(wildcard*.o)9/2/202377EmbeddedOperatingSystems$(patsubstpattern,replacementmakefile中的条件语句conditional-directivetext-if-trueendiforconditional-directivetext-if-trueelsetext-if-falseendif9/2/202378EmbeddedOperatingSystemsmakefile中的条件语句conditional-dire四种条件语句ifeq...else...endififneq…else…endififndef…else…endififndef...else…endif9/2/202379EmbeddedOperatingSystems四种条件语句ifeq...else...endif8/3/2实际项目中的makefile找到Linux或者uClinux源代码中所有的makefile,分析它们的功能、相互关系。9/2/202380EmbeddedOperatingSystems实际项目中的makefile找到Linux或者uClinux3、GNUTools—ldld,TheGNULinker
Linux上常用的链接器ld软件的作用是把各种目标文件(.o文件)和库文件链接在一起,并定位数据和函数地址,最终生成可执行程序gcc可以间接的调用ld,使用gcc的-Wl参数可以传递参数给ld使用命令:ld--help可以列出ld常用的一些选项9/2/202381EmbeddedOperatingSystems3、GNUTools—ldld,TheGNULinkeld使用举例(1)源程序编译hello.c到hello.o命令:gcc-chello.c9/2/202382EmbeddedOperatingSystemsld使用举例(1)源程序8/3/202382Embeddedld使用举例(2)链接命令:ld–dynamic-linker/lib/ld-linux.so.2/usr/lib/crt1.o/usr/lib/crti.o/usr/lib/crtn.ohello.o–lc–ohello运行./hello9/2/202383EmbeddedOperatingSystemsld使用举例(2)链接8/3/202383Embedded目标文件ld通过BFD库可以读取和操作coff、elf、a.out等各种执行文件格式的目标文件BFD(BinaryFileDescriptor)目标文件(objectfile)由多个节(section)组成,常见的节有:text节保存了可执行代码,data节保存了有初值的全局标量,bss节保存了无初值的全局变量。9/2/202384EmbeddedOperatingSystems目标文件ld通过BFD库可以读取和操作coff、elf、a.使用objdump查看目标文件的信息objdump–hhello.o比较hello
9/2/202385EmbeddedOperatingSystems使用objdump查看目标文件的信息8/3/202385Em链接描述文件(Linkerscript)可以使用链接描述文件控制ld的链接过程。链接描述文件,commandfile
又称为链接脚本,Linkerscript用来控制ld的链接过程描述各输入文件的各节如何映射到输出文件的各节控制输出文件中各个节或者符号的内存布局使用的语言为:Theldcommandlanguage,链接命令语言9/2/202386EmbeddedOperatingSystems链接描述文件(Linkerscript)可以使用链接描ld命令的-Tcommandfile选项指定了链接描述文件名如果不指定链接描述文件,ld就会使用一个默认的描述文件来产生执行文件找到Linux或者uClinux中的链接描述文件并分析。9/2/202387EmbeddedOperatingSystemsld命令的-Tcommandfile选项指定了链接描述文件链接描述文件的命令链接描述文件的命令主要包括如下几类:设置入口点命令处理文件的命令处理文件格式的命令其他9/2/202388EmbeddedOperatingSystems链接描述文件的命令链接描述文件的命令主要包括如下几类:8/3常用的命令设置入口点格式:ENTRY(symbol)
设置symbol的值为执行程序的入口点。ld有多种方法设置执行程序的入口点,确定程序入口点的顺序如下:ld命令的-e选项指定的值Entry(symbol)指定的值.text节的起始地址入口点为09/2/202389EmbeddedOperatingSystems常用的命令设置入口点8/3/202389EmbeddedO常用的命令INCULDEfilename
包含其他filename的链接描述文件INPUT(file,file,…)
指定多个输入文件名9/2/202390EmbeddedOperatingSystems常用的命令INCULDEfilename
包含其他file常用的命令OUTPUT_FORMAT(bfdname)
指定输出文件的格式OUTPUT_ARCH(bfdname)指定目标机器体系结构,例如:
OUTPUT_ARCH(arm)9/2/202391EmbeddedOperatingSystems常用的命令OUTPUT_FORMAT(bfdname)
指定常用的命令MEMORY:
这个命令在用于嵌入式系统的链接描述文件中经常出现,它描述了各个内存块的起始地址和大小。格式如下:MEMORY{ name[(attr)]:ORIGIN=origin,LENGTH=len …}例如:9/2/202392EmbeddedOperatingSystems常用的命令MEMORY:
这个命令在用于嵌入式系统的链接描述Memory举例9/2/202393EmbeddedOperatingSystemsMemory举例8/3/202393EmbeddedOpeSECTIONS命令SECTIONS
告诉ld如何把输入文件的各个节映射到输出文件的各个节中。在一个链接描述文件中只能有一个SECTIONS命令在SECTIONS命令中可以使用的命令有三种:定义入口点赋值定义输出节9/2/202394EmbeddedOperatingSystemsSECTIONS命令SECTIONS
告诉ld如何把输入文件定义输出节SECTIONS
{
...
secname:
{
contents
}
...
}例如:9/2/202395EmbeddedOperatingSystems定义输出节SECTIONS
{
...
secname定位计数器定位计数器,TheLocationCounter一个特殊的ld变量,使用“.”表示总是在SECTIONS中使用例如:9/2/202396EmbeddedOperatingSystems定位计数器定位计数器,TheLocationCounte一个简单例子下面是一个简单的例子:
例中,输出文件包含text,data,bss三个节,而输入文件也只包含这3个节:SECTIONS{ .=0x01000000; .text:{*(.text)}; .=0x08000000; .data:{*(.data)}; .bss:{*(.bss)};}9/2/202397EmbeddedOperatingSystems一个简单例子下面是一个简单的例子:
例中,输出文件包含texSECTIONS举例(对应于上面
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海济光职业技术学院《公司理财》2023-2024学年第二学期期末试卷
- 郑州澍青医学高等专科学校《智能感知》2023-2024学年第二学期期末试卷
- 天津海运职业学院《机器学习基础》2023-2024学年第二学期期末试卷
- 郑州工商学院《染织创意设计与技法》2023-2024学年第二学期期末试卷
- 重庆水利电力职业技术学院《知识产权管理学》2023-2024学年第二学期期末试卷
- 长春工业大学《效果图后期制作》2023-2024学年第二学期期末试卷
- 长沙职业技术学院《软件工程含实践》2023-2024学年第二学期期末试卷
- 武汉交通职业学院《行政领导学》2023-2024学年第二学期期末试卷
- 电子级磷酸制备企业制定与实施新质生产力项目商业计划书
- 公益慈善主题酒店企业制定与实施新质生产力项目商业计划书
- 粮安工程粮库智能化升级改造 投标方案(技术标)
- 吉塔行星模拟课程
- 2023上海虹口区初三语文一模作文写作指导及范文:这也是我的舞台
- 《反本能 如何对抗你的习以为常》读书笔记思维导图PPT模板下载
- 西南交11春学期《模拟电子技术A》离线作业
- 施工单位平安工地考核评价表(标准)
- JJF 1855-2020纯度标准物质定值计量技术规范有机物纯度标准物质
- GB/T 35194-2017土方机械非公路机械传动宽体自卸车技术条件
- GB 6245-2006消防泵
- SMT通用作业指导书
- 工作票培训-课件
评论
0/150
提交评论