第3部分程序设计方案基础.ppt
《第3部分程序设计方案基础.ppt》由会员分享,可在线阅读,更多相关《第3部分程序设计方案基础.ppt(201页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第3部分程序设计方案基础 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望GNU集成编译环境集成编译环境GCC(GNU Compiler Collection)是一种面向嵌入式领域、支持多种是一种面向嵌入式领域、支持多种编程语言、支持多种编程语言、支持多种CPU的交叉编译工具。的交叉编译工具。本章主要介绍:本章主要介绍:GCC编译过程编译过程C/C+交叉编译器交叉编译器arm-elf-gcc交叉汇编器交叉汇编器 arm-elf-as 交叉连接器交叉连接器arm-el
2、f-l d工程管理器工程管理器make汇编语言编程汇编语言编程混合编程混合编程3.1 GNU GCC简介简介GNU GCC是一套面向嵌入式领是一套面向嵌入式领域的交叉编译工具,支持多种编程语域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多编译、支持多种反汇编方式、支持多种调试信息格式种调试信息格式,目前支持目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种等多种CPU。GNU GCC的基本功能包括:的基本功能包括:输出预处理后的输出预处理后的C/C+源程序(展开头源
3、程序(展开头文件和替换宏)文件和替换宏)输出输出C/C+源程序的汇编代码源程序的汇编代码输出二进制目标文件输出二进制目标文件生成静态库生成静态库生成可执行程序生成可执行程序转换文件格式转换文件格式3.1.1 GCC 组成1.C/C+交叉编译器交叉编译器arm-elf-gccarm-elf-gcc是编译的前端程序,它通过调是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件用其他程序来实现将程序源文件编译成目标文件的功能。的功能。编译时,它首先调用预处理程序编译时,它首先调用预处理程序(cpp)对输对输入的源程序进行处理,然后调用入的源程序进行处理,然后调用 cc1 将预处理后将
4、预处理后的程序编译成汇编代码,最后由的程序编译成汇编代码,最后由arm-elf-as将汇将汇编代码编译成目标代码。编代码编译成目标代码。arm-elf-gcc具有丰富的命令选项,可以控具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。制编译的各个阶段,满足用户的各种编译需求。2.汇编器 arm-elf-asarm-elf-as将汇编语言程序转换为将汇编语言程序转换为ELF(Executable and Linking Format,执行时链接文件格式执行时链接文件格式)格式的可重定位目格式的可重定位目标代码,这些目标代码同其它目标模块或标代码,这些目标代码同其它目标模块或函数
5、库易于定位和链接。函数库易于定位和链接。arm-elf-as产生一个交叉参考表和一产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够个标准的符号表,产生的代码和数据能够放在多个区放在多个区(Section)中。中。3.连接器连接器arm-elf-ldarm-elf-ld根据链接定位文件根据链接定位文件Linkcmds中的代码区、数据区、中的代码区、数据区、BSS区和栈区等定位区和栈区等定位信息,将可重定位的目标模块链接成一个单信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。一的、绝对定位的目标程序。该目标程序是该目标程序是ELF格式,并且可以包含格式,并且可以包含调试信
6、息。调试信息。arm-elf-ld会产生一个内存映象文件会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符该文件显示所有目标模块、区和符号的绝对定位地址。号的绝对定位地址。它也产生交叉参考列表,显示参考每个它也产生交叉参考列表,显示参考每个全局符号的目标模块。全局符号的目标模块。arm-elf-ld支持将多个目标模块链接成一支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为对目标模块进行链接,这个特性称为增量链接增量链接(Incremental Linking)。假如输入文件是一个函数库,
7、假如输入文件是一个函数库,arm-elf-ld会自动从函数库装载被其它目标模块参考的函会自动从函数库装载被其它目标模块参考的函数模块。数模块。arm-elf-ld与其它链接程序与其它链接程序相比相比,能提供,能提供更有帮助的诊断信息。许多链接器遇到第一个更有帮助的诊断信息。许多链接器遇到第一个错误即放弃链接,而错误即放弃链接,而arm-elf-ld只要有可能都只要有可能都继续执行,帮助用户识别其它错误,有时甚至继续执行,帮助用户识别其它错误,有时甚至能获得输出代码。能获得输出代码。4.库管理器库管理器arm-elf-ararm-elf-ar将多个可重定位的目标模块将多个可重定位的目标模块归档为
8、一个函数库文件。归档为一个函数库文件。采用函数库文件,应用程序能够从该文采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。易于应用程序的开发管理。arm-elf-ar支持支持ELF格式的函数库文件格式的函数库文件.5.工程管理器工程管理器MAKEMake是用于自动编译、链接程序的实用是用于自动编译、链接程序的实用工具工具,使用使用make后就不需要手工的编译每个程后就不需要手工的编译每个程序文件。要使用序文件。要使用make,首先要
9、编写首先要编写makefile。Makefile描述程序文件之间的依赖关系,描述程序文件之间的依赖关系,并提供更新文件的命令。在一个程序中,可执并提供更新文件的命令。在一个程序中,可执行文件依赖于目标文件行文件依赖于目标文件,而目标文件依赖于源而目标文件依赖于源文件。如果文件。如果makefile文件存在文件存在,每次修改完源每次修改完源程序后,用户通常所需要做的事情就是在命令程序后,用户通常所需要做的事情就是在命令行敲入行敲入“make”,然后所有的事情都由然后所有的事情都由make来来完成。完成。6.其他实用程序其他实用程序目标文件格式转换工具目标文件格式转换工具arm-elf-objco
10、py支持的文件格式有支持的文件格式有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根据输入文件的后缀来确定根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括文件的类型,然后
11、根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为的汇编临时文件(后缀为.s););arm-elf-as将该汇编文件编译成目标文件将该汇编文件编译成目标文件(后缀为(后缀为.o););arm-elf-ld 根据用户的链接选项(包括指根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。起来生成可执行文件。图图3-1展示了该编译过程:展示了该编译过程:3.2 C/C+交叉编译器交叉编译器arm-elf-gcc3.2.1 3.2.1 概述概述概述概述a
12、rm-elf-gccarm-elf-gcc是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。他程序来实现将程序源文件编译成目标文件。编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序编译时它首先调用预处理程序(cpp)(cpp)对输入的源对输入的源对输入的源对输入的源程序进行处理程序进行处理程序进行处理程序进行处理;然后调用然后调用然后调用然后调用cc1cc1将预处理后的程序编译
13、成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码将预处理后的程序编译成汇编代码;最后由最后由最后由最后由arm-elf-asarm-elf-as将汇编代码编译成目标代码。将汇编代码编译成目标代码。将汇编代码编译成目标代码。将汇编代码编译成目标代码。arm-elf-gccarm-elf-gcc具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的具有丰富的命令选项,控制编译的各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求各个阶段,满足用户的各种编译需求 1.命令格式命令格式arm-elf-
14、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 file 将输出内容存于文件将输出内容存于文件file-
15、pipe 在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式在编译的不同阶段之间采用管道通讯方式-v 打印出编译过程中执行的命令打印出编译过程中执行的命令-x language 说明文件的输入类型为说明文件的输入类型为languageC语言选项:语言选项:-ansi 支持所有支持所有ANSI C程序程序警告选项:警告选项:-w 关闭所有警告关闭所有警告-Wall 打开所有警告打开所有警告-Wimplicit 如果有隐含申明,显示警告信息如果有隐含申明,显示警告信息-Wno-implicit 不显示对隐含申明的警告不显示对隐含申明的警告调
16、试选项:调试选项:-g 在文件中产生调试信息在文件中产生调试信息(调试信息的文调试信息的文件格式有件格式有stabs、COFF、XCOFF、DWARF)优化选项:优化选项:-O0 不优化不优化-O1 一级优化一级优化-O2 二级优化二级优化-O3 三级优化三级优化预处理选项:预处理选项:-E 运行运行C的预处理器的预处理器-C 在运用在运用-E进行预处理时不去掉注释进行预处理时不去掉注释-D macro 定义宏定义宏macro为为1-D macro=defn 定义宏定义宏macro为为defn汇编选项:汇编选项:-Wa,option 将选项将选项option传递传递 给汇编器给汇编器搜索路径选
17、项:搜索路径选项:-I dir 设置搜索路径为设置搜索路径为dir-I-指定只对指定只对#include file,有有效的头文件搜索目录效的头文件搜索目录 3.源文件类型的识别源文件类型的识别arm-elf-gccarm-elf-gcc能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型能够自动根据文件名后缀识别文件类型.文件名后缀文件名后缀文件名后缀文件名后缀和和和和文件类型文件类型文件类型文件类型的对应关系如下:的对应关系如下:的对应关系如下:的对应关系如下:*.c*.c CC源文件源文件源文件源文件*.i*.i 经过预处理后的经过预处理
18、后的经过预处理后的经过预处理后的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需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇
19、编文件此外,用户可通过此外,用户可通过此外,用户可通过此外,用户可通过-x language-x language说明文件的输入类说明文件的输入类说明文件的输入类说明文件的输入类型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。型,此时可以不用以上的后缀规则。-x language-x language其中的其中的其中的其中的languagelanguage可为:可为:可为:可为:c c CC源文件源文件源文件源文件c+c+C+C+源文件源文件源文件源文件c-header c-header CC头文件头文件头文件头文件cpp-output cpp-
20、output 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C C源文件源文件源文件源文件c+-cpp-output c+-cpp-output 经过预处理后的经过预处理后的经过预处理后的经过预处理后的C+C+源文件源文件源文件源文件assembler assembler 不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件不需要预处理的汇编文件assembler-with-cpp assembler-with-cpp 需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件需要预处理的汇编文件例如,编译一个不需要预处理的例如,编译一个不需要预处理的例如,编译一个不
21、需要预处理的例如,编译一个不需要预处理的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将输出内容存于文件将输出内容存于文件file,仅适用于,仅适用于只有一个
22、输出文件时。只有一个输出文件时。例如,将例如,将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编译生成汇编文件编译生成汇编文件test.s:arm-elf-gcc S
23、 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设置头文件搜索路径设置头文件搜索路径头文件的头文件的引用引用有两种形式:有两种形式:一种是一种是#include“filename”,一种是一种是
24、#include。前一种形式的前一种形式的路径搜索顺序路径搜索顺序是:当前目录、是:当前目录、指定的搜索路径;指定的搜索路径;后一种形式只搜索指定路径。后一种形式只搜索指定路径。-I dir将目录将目录dir添加到头文件搜索目录列表的第添加到头文件搜索目录列表的第一项。一项。通过此选项可以使用户头文件先于系统头文通过此选项可以使用户头文件先于系统头文件被搜索到。件被搜索到。如果同时用如果同时用-I选项添加几个目录,目录被搜选项添加几个目录,目录被搜索时的优先级顺序为从左到右。索时的优先级顺序为从左到右。例如,编译例如,编译test.c,在当前目录和,在当前目录和/include中搜索中搜索te
25、st.c所包含的头文件:所包含的头文件:arm-elf-gcc I./I/include c test.c-I-I-以前以前用用-I指定的头文件搜索目录只指定的头文件搜索目录只对对#include“file”有效,对有效,对#include 无效;无效;-I-以后以后指定的头文件搜索目录对以上指定的头文件搜索目录对以上两种形式的头文件都有效。两种形式的头文件都有效。此外,此外,-I-会禁止对当前目录的隐含搜会禁止对当前目录的隐含搜索,不过用户可以通过使用索,不过用户可以通过使用“-I.”使能对当使能对当前目录的搜索。前目录的搜索。例如例如:在需要编译的在需要编译的test.c文件对头文件的引用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 部分 程序设计 方案 基础
限制150内