最新嵌入式程序设计基础GCC编译过程PPT课件.ppt

上传人:豆**** 文档编号:56700677 上传时间:2022-11-03 格式:PPT 页数:202 大小:1.63MB
返回 下载 相关 举报
最新嵌入式程序设计基础GCC编译过程PPT课件.ppt_第1页
第1页 / 共202页
最新嵌入式程序设计基础GCC编译过程PPT课件.ppt_第2页
第2页 / 共202页
点击查看更多>>
资源描述

《最新嵌入式程序设计基础GCC编译过程PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式程序设计基础GCC编译过程PPT课件.ppt(202页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、嵌入式程序设计基础嵌入式程序设计基础GCCGCC编编译过程译过程GNU集成编译环境集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种是一种面向嵌入式领域、支持多种编程语言、支持多种编程语言、支持多种CPU的交叉编译工具。的交叉编译工具。本章主要介绍:本章主要介绍:GCC编译过程编译过程C/C+交叉编译器交叉编译器arm-elf-gcc交叉汇编器交叉汇编器 arm-elf-as 交叉连接器交叉连接器arm-elf-l d工程管理器工程管理器make汇编语言编程汇编语言编程混合编程混合编程4.库管理器库管理器arm-elf-ararm-elf-ar将

2、多个可重定位的目标模块将多个可重定位的目标模块归档为一个函数库文件。归档为一个函数库文件。采用函数库文件,应用程序能够从该文采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。易于应用程序的开发管理。arm-elf-ar支持支持ELF格式的函数库文件格式的函数库文件.5.工程管理器工程管理器MAKEMake是用于自动编译、链接程序的实用是用于自动编译、链接程序的实用工具工具,使用使用make后就不需要手工的编译每个程后就不需要手工的编

3、译每个程序文件。要使用序文件。要使用make,首先要编写首先要编写makefile。Makefile描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,并提供更新文件的命令。在一个程序中,可执并提供更新文件的命令。在一个程序中,可执行文件依赖于目标文件行文件依赖于目标文件,而目标文件依赖于源文而目标文件依赖于源文件。如果件。如果makefile文件存在文件存在,每次修改完源程序每次修改完源程序后,用户通常所需要做的事情就是在命令行敲后,用户通常所需要做的事情就是在命令行敲入入“make”,然后所有的事情都由然后所有的事情都由make来完成。来完成。6.其他实用程序其他实用程序目标文件格式转

4、换工具目标文件格式转换工具arm-elf-objcopy支持的文件格式有支持的文件格式有H-record、S-record、ABS、BIN、COFF、ELF。例如,它能够将例如,它能够将ELF格式文件转换为其格式文件转换为其它格式的文件,如它格式的文件,如intel H-record格式、格式、Motorola S-record等。等。arm-elf-nm程程序用于显示文件中的符号信息。序用于显示文件中的符号信息。3.1.2 GCC编译程序的基本过程编译程序的基本过程GCC编译程序的编译程序的基本过程基本过程如下:如下:arm-elf-gcc根据输入文件的后缀来确定根据输入文件的后缀来确定文件

5、的类型,然后根据用户的编译选项(包括文件的类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为的汇编临时文件(后缀为.s););arm-elf-as将该汇编文件编译成目标文件将该汇编文件编译成目标文件(后缀为(后缀为.o););arm-elf-ld 根据用户的链接选项(包括指根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。起来生成可执行文件。图图3-1展示了该编译过程:展示了该编译过程:3.2 C/C+交叉编译器交叉编译器arm-el

6、f-gcc3.2.1 3.2.1 概述概述概述概述arm-elf-gccarm-elf-gcc是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序(cpp)(cpp)对输入的源对输入的源对输入的源对输入的源程序进行处理程序进行处理程序进行处理程序进行处理;然后调用然后

7、调用然后调用然后调用cc1cc1将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码;最后由最后由最后由最后由arm-elf-asarm-elf-as将汇编代码编译成目标代码。将汇编代码编译成目标代码。将汇编代码编译成目标代码。将汇编代码编译成目标代码。arm-elf-gccarm-elf-gcc具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户

8、的各种编译需求 1.命令格式命令格式arm-elf-gcc options file在命令在命令arm-elf-gcc后面跟一个或后面跟一个或多个选项,选项间用空格隔开,然后跟多个选项,选项间用空格隔开,然后跟一个或多个目标文件。一个或多个目标文件。例如,将例如,将test.c 编译成目标文件编译成目标文件test.o 并且生成调试信息:并且生成调试信息:arm-elf-gcc g c o test.o test.c 2.命令选项列表命令选项列表输出控制选项:输出控制选项:-c 将输入的源文件编译成目标文件将输入的源文件编译成目标文件-S 将将C/C+文件生成汇编文件文件生成汇编文件-o fi

9、le 将输出内容存于文件将输出内容存于文件file-pipe 在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式-v 打印出编译过程中执行的命令打印出编译过程中执行的命令-x language 说明文件的输入类型为说明文件的输入类型为languageC语言选项:语言选项:-ansi 支持所有支持所有ANSI C程序程序警告选项:警告选项:-w 关闭所有警告关闭所有警告-Wall 打开所有警告打开所有警告-Wimplicit 如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息-Wno-implic

10、it 不显示对隐含申明的警告不显示对隐含申明的警告调试选项:调试选项:-g 在文件中产生调试信息在文件中产生调试信息(调试信息的文件调试信息的文件格式有格式有stabs、COFF、XCOFF、DWARF)优化选项:优化选项:-O0 不优化不优化-O1 一级优化一级优化-O2 二级优化二级优化-O3 三级优化三级优化预处理选项:预处理选项:-E 运行运行C的预处理器的预处理器-C 在运用在运用-E进行预处理时不去掉注释进行预处理时不去掉注释-D macro 定义宏定义宏macro为为1-D macro=defn 定义宏定义宏macro为为defn汇编选项:汇编选项:-Wa,option 将选项将

11、选项option传递传递 给汇编器给汇编器搜索路径选项:搜索路径选项:-I dir 设置搜索路径为设置搜索路径为dir-I-指定只对指定只对#include file,有有效的头文件搜索目录效的头文件搜索目录 3.源文件类型的识别源文件类型的识别arm-elf-gccarm-elf-gcc能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型.文件名后缀文件名后缀文件名后缀文件名后缀和和和和文件类型文件类型文件类型文件类型的对应关系如下:的对应关系如下:的对应关系如下:的对应关系如下:*.c*.c CC源文件源文

12、件源文件源文件*.i*.i 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件*.h*.h CC头文件头文件头文件头文件*.ii*.ii 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C+C+源文件源文件源文件源文件*.cc*.cc C+C+源文件源文件源文件源文件*.cxx*.cxx C+C+源文件源文件源文件源文件*.cpp*.cpp C+C+源文件源文件源文件源文件*.C*.CC+C+源文件源文件源文件源文件*.s*.s 不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件*.S*.S需要预处理的汇编文件需

13、要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件此外,用户可通过此外,用户可通过此外,用户可通过此外,用户可通过-x language-x language说明文件的输入类说明文件的输入类说明文件的输入类说明文件的输入类型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。-x language-x language其中的其中的其中的其中的languagelanguage可为:可为:可为:可为:c c CC源文件源文件源文件源文件c+c+C+C+源文件源文件源文件源文件c-header c-header CC头

14、文件头文件头文件头文件cpp-output cpp-output 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件c+-cpp-output c+-cpp-output 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C+C+源文件源文件源文件源文件assembler assembler 不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件assembler-with-cpp assembler-with-cpp 需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件例如,编译一个不需要

15、预处理的例如,编译一个不需要预处理的例如,编译一个不需要预处理的例如,编译一个不需要预处理的C C程序:程序:程序:程序:arm-elf-gcc c g xarm-elf-gcc c g xcpp-output test.ccpp-output test.c-x none-x none如果如果如果如果-x-x后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做后面未跟任何参数,则按照文件的后缀名做相应处理。相应处理。相应处理。相应处理。3.2.2 命令使用命令使用1.输出文件名的指定输出文件名的指定-o file将输出内容存于文件将

16、输出内容存于文件file,仅适用于,仅适用于只有一个输出文件时。只有一个输出文件时。例如,将例如,将test.c编译成汇编程序并存编译成汇编程序并存放于文件放于文件test.txt:arm-elf-gcc S o test.txt test.c2.目标文件的生成目标文件的生成 -c将输入的源文件编译成目标文件。将输入的源文件编译成目标文件。例如,将例如,将test.c编译成编译成test.o:arm-elf-gcc c o test.o test.c3将将C/C+文件生成汇编文件文件生成汇编文件 -S将将C/C+文件生成汇编文件。文件生成汇编文件。例如例如:将将test.c编译生成汇编文件编译

17、生成汇编文件test.s:arm-elf-gcc S o test.s test.c4.预处理文件的生成预处理文件的生成-E只对源文件进行预处理并且缺省输出到标准只对源文件进行预处理并且缺省输出到标准输出。输出。例如,对例如,对test.c进行预处理并将结果输出到进行预处理并将结果输出到屏幕:屏幕:arm-elf-gcc E test.c例如,对例如,对test.c进行预处理并将结果输出到进行预处理并将结果输出到文件文件test.txt:arm-elf-gcc E o test.txt test.c5设置头文件搜索路径设置头文件搜索路径头文件的头文件的引用引用有两种形式:有两种形式:一种是一种

18、是#include“filename”,一种是一种是#include。前一种形式的前一种形式的路径搜索顺序路径搜索顺序是:当前目录、是:当前目录、指定的搜索路径;指定的搜索路径;后一种形式只搜索指定路径。后一种形式只搜索指定路径。-I dir将目录将目录dir添加到头文件搜索目录列表的第添加到头文件搜索目录列表的第一项。一项。通过此选项可以使用户头文件先于系统头文通过此选项可以使用户头文件先于系统头文件被搜索到。件被搜索到。如果同时用如果同时用-I选项添加几个目录,目录被搜选项添加几个目录,目录被搜索时的优先级顺序为从左到右。索时的优先级顺序为从左到右。例如,编译例如,编译test.c,在当前

19、目录和,在当前目录和/include中搜索中搜索test.c所包含的头文件:所包含的头文件:arm-elf-gcc I./I/include c test.c-I-I-以前以前用用-I指定的头文件搜索目录只对指定的头文件搜索目录只对#include“file”有效,对有效,对#include 无效;无效;-I-以后以后指定的头文件搜索目录对以上指定的头文件搜索目录对以上两种形式的头文件都有效。两种形式的头文件都有效。此外,此外,-I-会禁止对当前目录的隐含搜会禁止对当前目录的隐含搜索,不过用户可以通过使用索,不过用户可以通过使用“-I.”使能对当使能对当前目录的搜索。前目录的搜索。例如例如:在

20、需要编译的在需要编译的test.c文件对头文件的引用有:文件对头文件的引用有:#include#include“file2.h”#include“file3.h”其中,其中,file1.h在目录在目录/include/test下,下,file2.h在在/include下,下,file3.h在当前目录下。在当前目录下。在以下命令行中,只能搜索到在以下命令行中,只能搜索到file2.h,而不,而不 能搜索到能搜索到file1.h:arm-elf-gcc I./include/test I I./include c arm-elf-gcc I./include/test I I./include c

21、 test.ctest.c而在以下命令行中而在以下命令行中,可以搜索到需要的两个头可以搜索到需要的两个头文件文件file1.h和和file2.h:arm-elf-gcc I I./include I./include/test c test.carm-elf-gcc I I./include I./include/test c test.c如果要搜索到如果要搜索到如果要搜索到如果要搜索到file3.hfile3.h,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索,必须要添加对当前目录的搜索:arm-elf-gcc I I.I./include I./incl

22、ude/test c test.carm-elf-gcc I I.I./include I./include/test c test.c实质上,上述编译命令等价于实质上,上述编译命令等价于实质上,上述编译命令等价于实质上,上述编译命令等价于:arm-elf-gcc I.I./include I./include/test c test.c arm-elf-gcc I.I./include I./include/test c test.c 与与与与 arm-elf-gcc I./include I./include/test c test.c arm-elf-gcc I./include I./

23、include/test c test.c6控制警告产生控制警告产生用户可以使用以用户可以使用以用户可以使用以用户可以使用以-W-W开头的不同选项对特定警告进行开头的不同选项对特定警告进行开头的不同选项对特定警告进行开头的不同选项对特定警告进行设定。设定。设定。设定。对于每种警告类型都有相应以对于每种警告类型都有相应以对于每种警告类型都有相应以对于每种警告类型都有相应以-Wno-Wno-开始的选项关闭开始的选项关闭开始的选项关闭开始的选项关闭警告。警告。警告。警告。例如例如例如例如:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警告信息:如果有隐含申明,显示警

24、告信息:arm-elf-gcc c Wimplicit test.carm-elf-gcc c Wimplicit test.c不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:不显示对隐含申明的警告:arm-elf-gcc c Wnoimplicit test.carm-elf-gcc c Wnoimplicit test.c常用的警告选项有:常用的警告选项有:常用的警告选项有:常用的警告选项有:-w-w 关闭所有警告信息。关闭所有警告信息。关闭所有警告信息。关闭所有警告信息。-Wall-Wall 打开所有警告信息。打开所有警告信息。打开所有警告信息。打开所有警告信息。

25、7实现优化实现优化优化的优化的主要目的主要目的是使编译生成的代码的是使编译生成的代码的尺寸更小、运行速度更快。尺寸更小、运行速度更快。但是在编译过程中随着优化级别的升高,但是在编译过程中随着优化级别的升高,编译器会相应消耗更多时间和内存,而且优编译器会相应消耗更多时间和内存,而且优化生成代码的执行顺序和源代码有一定出入,化生成代码的执行顺序和源代码有一定出入,因此优化选项更多地用于生成固化代码,而因此优化选项更多地用于生成固化代码,而不用于生成调试代码。不用于生成调试代码。arm-elf-gcc支持多种优化选项,总体上划支持多种优化选项,总体上划分为分为三级优化三级优化:1.1.-O1 可以部

26、分减小代码尺寸,对运行速可以部分减小代码尺寸,对运行速度有一定的提高。较多地使用了寄存器变量,提度有一定的提高。较多地使用了寄存器变量,提高指令的并行度。高指令的并行度。2.2.-O2 除了解循环、函数插装和静态变量优除了解循环、函数插装和静态变量优化,几乎包含化,几乎包含arm-elf-gcc所有优化选项。一般所有优化选项。一般在生成固化代码时使用该选项较为适宜。在生成固化代码时使用该选项较为适宜。3.3.-O3 包含包含-O2的所有优化,并且还包含了的所有优化,并且还包含了解循环、函数插装和静态变量优化。通常情况下解循环、函数插装和静态变量优化。通常情况下,该级优化生成的代码执行速度最快,

27、但是代码,该级优化生成的代码执行速度最快,但是代码尺寸比尺寸比-O2大一些。大一些。8在命令行定义宏在命令行定义宏-D macro定义宏定义宏macro为为1。-D macro=defn 定义宏定义宏macro为为defn。例如例如:编译编译test.c并且预定义宏并且预定义宏 RUN_CACHE 值为值为1:arm-elf-gcc c D RUN_CACHE test.c编译编译test.c并且预定义宏并且预定义宏 RUN_CACHE 值为值为0:arm-elf-gcc c D RUN_CACHE=0 test.c 3.3 交叉连接器交叉连接器arm-elf-ld3.3.1 概述概述arm-

28、elf-ld根据链接定位文件根据链接定位文件Linkcmds中代码段、数据段、中代码段、数据段、BSS段和堆栈段等定位段和堆栈段等定位信息,将可重定位的目标模块链接成一个单信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序,该目标程序是一的、绝对定位的目标程序,该目标程序是ELF格式,并且可以包含调试信息。格式,并且可以包含调试信息。arm-elf-ld可以输出一个内存映象文件,可以输出一个内存映象文件,该文件显示所有目标模块、段和符号的绝对该文件显示所有目标模块、段和符号的绝对定位地址,它也产生目标模块对全局符号引定位地址,它也产生目标模块对全局符号引用的交叉参考列表。用的交叉参

29、考列表。arm-elf-ld支持将多个目标模块支持将多个目标模块链接成一个单一的、绝对定位的目链接成一个单一的、绝对定位的目标程序,也能够依次对目标模块进标程序,也能够依次对目标模块进行链接,这个特性称为行链接,这个特性称为增量链接增量链接(Incremental Linking)。)。arm-elf-ld会自动从库中装载被会自动从库中装载被调用函数所在的模块。调用函数所在的模块。1命令格式命令格式arm-elf-ld option file命令行后跟选项和可重定位的目标文件名。命令行后跟选项和可重定位的目标文件名。例如例如:链接的输入文件为链接的输入文件为demo.o,输出文件为,输出文件为

30、demo.elf,链接的库为,链接的库为libxxx.a,生成内存映象,生成内存映象文件文件map.txt,链接定位文件为,链接定位文件为linkcmds,则命,则命令如下:令如下:arm-elf-ld-Map map.txt-T linkcmds-L./lib o demo.elf demo.o lxxx2命令选项列表命令选项列表-e entry指定程序入口指定程序入口-M输出链接信息输出链接信息-lar指定链接库指定链接库-L dir添加搜索路径添加搜索路径-o设置输出文件名设置输出文件名-Tcommandfile指定链接命令文件指定链接命令文件-v显示版本信息显示版本信息-Map制定输出

31、映像文件制定输出映像文件3.3.2 命令使用命令使用1 1程序入口地址程序入口地址程序入口地址程序入口地址-e entry-e entry以符号以符号以符号以符号entryentry作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认作为程序执行的入口地址,而不从默认的入口地址开始。默认入口地址的指定方式和其他指定的入口地址开始。默认入口地址的指定方式和其他指定的入口地址开始。默认入口地址的指定方式和其他指定的入口地址开始。默认入口地址的指定方式和其他指定方式的描述,参见方式的描述,参见方式的描述,参见方式的描述,参见3.3.33.3.3节。节

32、。节。节。例如,链接的输入文件为例如,链接的输入文件为例如,链接的输入文件为例如,链接的输入文件为demo.odemo.o,输出文件为,输出文件为,输出文件为,输出文件为demo.elfdemo.elf,链接定位文件为,链接定位文件为,链接定位文件为,链接定位文件为linkcmdslinkcmds,将入口地址设为,将入口地址设为,将入口地址设为,将入口地址设为_start_start,命令如下:,命令如下:,命令如下:,命令如下:arm-elf-ld T linkcmds e _start o demo.elf arm-elf-ld T linkcmds e _start o demo.elf

33、 demo.odemo.o2输出链接信息输出链接信息-M在标准端口打印出符号映象表和内存分布信在标准端口打印出符号映象表和内存分布信息。息。例如:例如:链接的输入文件为链接的输入文件为demo.o,输出文件为输出文件为demo.elf,在标准端口打印出符号映象表和内存在标准端口打印出符号映象表和内存分布信息,命令如下:分布信息,命令如下:arm-elf-ld M o demo.elf demo.o如果标准输出设置为显示器,运行命令后将如果标准输出设置为显示器,运行命令后将在显示器上显示内存映象信息和符号映象表。在显示器上显示内存映象信息和符号映象表。-Map mapfile将链接的符号映象表和

34、内存分布信将链接的符号映象表和内存分布信息输出到文件息输出到文件mapfile里。里。例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,将链接的符号映象表和,将链接的符号映象表和内存分布信息输出到文件内存分布信息输出到文件map.txt里,命里,命令如下:令如下:arm-elf-ld Map map.txt o demo.elf demo.o3指定链接的库指定链接的库-lar指定库文件指定库文件libar.a为链接的库。为链接的库。可以重复使用可以重复使用-l来指定多个链接的库。来指定多个链接的库。例如例如:链接的输入文件为链接的输入文件为demo

35、.o,指定,指定libxxx.a为为链接的库,输出文件为链接的库,输出文件为demo.elf,命令如下:,命令如下:arm-elf-ld o demo.elf demo.o lxxx注意:库的命名规则为注意:库的命名规则为libxxx.a,在,在-l指定库指定库名时使用的格式为名时使用的格式为-lxxx。4添加库和脚本文件的搜索路径添加库和脚本文件的搜索路径-Ldir将将dir添加到搜索路径。添加到搜索路径。搜索顺序按照命令行中输入的顺序,并且搜索顺序按照命令行中输入的顺序,并且优先于默认的搜索路径。优先于默认的搜索路径。所有在所有在-L添加的目录中找到的添加的目录中找到的-l指定的库都指定的

36、库都有效。有效。例如例如:链接的输入文件为链接的输入文件为demo.o,输出文件,输出文件为为demo.elf,将,将/lib添加到库的搜索路径,命令添加到库的搜索路径,命令如下:如下:arm-elf-ld-L./lib o demo.elf demo.o 5设置输出文件的名字设置输出文件的名字-o output将输出文件名字设定为将输出文件名字设定为output。如果。如果不指定输出文件名,不指定输出文件名,arm-elf-ld生成文件生成文件名默认为名默认为a.out。例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,命令如下:,命令如下:ar

37、m-elf-ld o demo.elf demo.o3.3.3 linkcmds连接命令文件连接命令文件 arm-elf-ld的命令语言是一种描述性的脚本的命令语言是一种描述性的脚本语言,它主要应用于控制语言,它主要应用于控制:有哪些输入文件、文有哪些输入文件、文件的格式怎样、输出文件中的模块怎样布局、件的格式怎样、输出文件中的模块怎样布局、分段的地址空间怎样分布、以及未初始化的数分段的地址空间怎样分布、以及未初始化的数据段怎样处理等。据段怎样处理等。用命令语言写成的文件用命令语言写成的文件(通常称为通常称为linkcmds)具有可重用性具有可重用性,不必每次在命令行输不必每次在命令行输入一大

38、堆命令选项入一大堆命令选项.并且对于不同的应用并且对于不同的应用,只需对只需对linkcmds进行简单的修改就可以使用。进行简单的修改就可以使用。1调用调用linkcmds首先写一个链接命令文件首先写一个链接命令文件linkcmds,然后,然后在在arm-elf-ld的命令中使用的命令中使用-T linkcmds参参数数,就能在链接时自动调用就能在链接时自动调用linkcmds文件文件例如例如:链接的输入文件为链接的输入文件为demo.o,输出文,输出文件为件为demo.elf,链接定位文件为,链接定位文件为linkcmds,则命令如下,则命令如下:arm-elf-ld T linkcmds

39、o demo.elf demo.o2编写编写linkcmds(1)arm-elf-ld命令语言命令语言arm-elf-ld命令语言是一系列语句的集命令语言是一系列语句的集合,包括用简单的关键字设定选项、描述合,包括用简单的关键字设定选项、描述输入文件及其格式、命名输出文件。输入文件及其格式、命名输出文件。其中有两种语句对于链接过程起重要其中有两种语句对于链接过程起重要作用:作用:SECTIONS语句和语句和MEMORY语句。语句。SECTIONS语句用于描述输出文件中的模语句用于描述输出文件中的模块怎样布局,块怎样布局,MEMORY语句描述目标机中语句描述目标机中可以用的存储单元。可以用的存储

40、单元。(2)表达式)表达式在在linkcmds中的表达式与中的表达式与C语言中的表达语言中的表达式类似,它们具有如下的特征:式类似,它们具有如下的特征:表达式的值都是表达式的值都是“unsigned long”或者或者“long”类型类型常数都是整数常数都是整数支持支持C语言中的操作符语言中的操作符可以引用或者定义全局变量可以引用或者定义全局变量可以使用内建的函数可以使用内建的函数 整数整数八进制数以八进制数以0开头,例如:开头,例如:0234;十进制数以非十进制数以非0的数字开头,例如:的数字开头,例如:567;十六进制数以十六进制数以0 x或或0X开头,例如:开头,例如:0 x16;负数以

41、运算符负数以运算符-开头,例如:开头,例如:-102;以以K,M为后缀分别表示以为后缀分别表示以1024,1024*1024为单位,例如:为单位,例如:var1=1K和和var1=1024相等,相等,var2=1M和和var2=1024*1024相等。相等。变量名变量名以字母、下划线和点开头,可以包含任何字以字母、下划线和点开头,可以包含任何字母、下划线、数字、点和连接符。母、下划线、数字、点和连接符。变量名不能和关键字一样,如果变量名和关变量名不能和关键字一样,如果变量名和关键字一样,或者变量名中包含空格时,必须将变键字一样,或者变量名中包含空格时,必须将变量名包含在量名包含在“”中中.例如

42、:例如:“SECTION”9;“with a space”“also with a space”+10;在在arm-elf-ld命令语言中,空格用于界定相邻命令语言中,空格用于界定相邻符号,例如:符号,例如:A-B表示一个变量名,而表示一个变量名,而A-B表示表示一个减法的表达式。一个减法的表达式。地址记数器点号地址记数器点号“.”“.”是一个包含当前输出地址的计数器。是一个包含当前输出地址的计数器。因为因为“.”总是表示某个输出段的地址,所总是表示某个输出段的地址,所以总是和表达式一起在以总是和表达式一起在SECTIONS命令中出命令中出现。现。“.”可以在任何一般符号出现的地方出现,可以在

43、任何一般符号出现的地方出现,对对“.”的赋值将引起计数器所指位置的移动,的赋值将引起计数器所指位置的移动,而计数器位置不能反向移动。而计数器位置不能反向移动。例如:例如:SECTIONSoutput:file1(.text).=.+1000;file2(.text).+=1000;file3(.text)=0 x1234;在左面的例子中,在左面的例子中,在在file1(.text)与)与file2(.text)之间)之间被空出了被空出了1000个字个字节的空间,节的空间,file2(.text)与)与file3(.text)之间)之间也被空出了也被空出了1000个个字节的空间,而字节的空间,而

44、0 x1234为该分段的为该分段的空间空隙的填充值。空间空隙的填充值。可以将可以将“.”赋给变量赋给变量;也可以对也可以对“.”赋值。赋值。例如:例如:data_start=.;.=.+2000;(3)linkcmds的结构的结构linkcmds文件主要由四个部分文件主要由四个部分组成组成:1.1.程序入口说明:用于指定程序运行时所需程序入口说明:用于指定程序运行时所需要执行的第一条指令的地址。要执行的第一条指令的地址。2.2.程序头说明:生成目标文件类型为程序头说明:生成目标文件类型为ELF,可,可以指定详细的程序头信息。以指定详细的程序头信息。3.3.内存布局的说明:用于规划内存的布局,内

45、存布局的说明:用于规划内存的布局,将内存空间划分为不同的部分。将内存空间划分为不同的部分。4.4.分段的分步说明:详细指明各个分段的构分段的分步说明:详细指明各个分段的构成以及分段的定位地址和装载地址。成以及分段的定位地址和装载地址。其中其中和和的部分不能被省略。的部分不能被省略。(4)对程序入口的说明)对程序入口的说明arm-elf-ld命令语言有一条特定命令用于指定命令语言有一条特定命令用于指定输出文件中第一条可执行指令输出文件中第一条可执行指令,即程序的入口点。即程序的入口点。该命令格式如下:该命令格式如下:ENTRY(symbol)其中其中ENTRY是保留字,是保留字,symbol表示

46、程序的表示程序的入口地址,通常是用一个全局地址标号(入口地址,通常是用一个全局地址标号(label)来表示入口地址。来表示入口地址。例如,在程序中的开始地方有一标号:例如,在程序中的开始地方有一标号:.global demo_startdemo_start:movl$_stack_top,%esp那么在那么在linkcmds中可以用下面的方式说明中可以用下面的方式说明程序的入口:程序的入口:ENTRY(demo_start);该命令可以作为单独的一条命令放在该命令可以作为单独的一条命令放在linkcmds的任何位置,也可以放在的任何位置,也可以放在SECTIONS内关内关于段的定义部分,都对布

47、局起作用。于段的定义部分,都对布局起作用。指定入口地址的方式还有很多,现在按优先指定入口地址的方式还有很多,现在按优先级递减的顺序描述如下:级递减的顺序描述如下:用用-e选项指定入口地址选项指定入口地址在在linkcmds里用里用ENTRY(symbol)指令)指令变量变量start的值,如果有变量的值,如果有变量start.text段第一字节的地址,如果存在段第一字节的地址,如果存在0地址地址(5)对程序头的说明)对程序头的说明ELF格式文件需要使用程序头,它用格式文件需要使用程序头,它用于描述程序应该怎么被装入内存。于描述程序应该怎么被装入内存。在默认情况下,在默认情况下,arm-elf-

48、ld可以自己可以自己生成一个程序头,用户也可以用生成一个程序头,用户也可以用PHDRS自己编写程序头,当运用该命令时,自己编写程序头,当运用该命令时,arm-elf-ld不会生成默认的程序头。不会生成默认的程序头。注意:如果没有特殊要求,建议用户注意:如果没有特殊要求,建议用户不要不要自己写程序头。自己写程序头。PHDRSPHDRS name type FILEHDR PHDRS AT(address)name type FILEHDR PHDRS AT(address)FLAGS FLAGS(flagsflags);其中其中其中其中PHDRSPHDRS、FILEHDRFILEHDR、ATAT

49、、FLAGSFLAGS都是关键字。都是关键字。都是关键字。都是关键字。namename表示段(表示段(表示段(表示段(SegmentSegment)的名字,而该段)的名字,而该段)的名字,而该段)的名字,而该段(SegmentSegment)装入的内容由)装入的内容由)装入的内容由)装入的内容由SECTIONSSECTIONS中对分段中对分段中对分段中对分段(SectionSection)的描述决定,例如:)的描述决定,例如:)的描述决定,例如:)的描述决定,例如:SECTIONSSECTIONSsecname start BLOCK(align)(NOLOAD):AT(secname sta

50、rt BLOCK(align)(NOLOAD):AT(ldadr)ldadr)contents region:phdr=fill contents region:phdr=fill 因此因此因此因此PHDRSPHDRS中的中的中的中的namename应该和应该和应该和应该和SECTIONSSECTIONS中的中的中的中的phdrphdr保持一致。保持一致。保持一致。保持一致。typetype表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意表示段的类型,可以为下面描述的任意一种类型(括号内表示关键字的值):一种类型(括号内表示关键字的值):一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁