嵌入式基础:ARM下GCC交叉编译器的制作

上传人:m**** 文档编号:513193164 上传时间:2022-08-14 格式:DOCX 页数:15 大小:203.69KB
返回 下载 相关 举报
嵌入式基础:ARM下GCC交叉编译器的制作_第1页
第1页 / 共15页
嵌入式基础:ARM下GCC交叉编译器的制作_第2页
第2页 / 共15页
嵌入式基础:ARM下GCC交叉编译器的制作_第3页
第3页 / 共15页
嵌入式基础:ARM下GCC交叉编译器的制作_第4页
第4页 / 共15页
嵌入式基础:ARM下GCC交叉编译器的制作_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《嵌入式基础:ARM下GCC交叉编译器的制作》由会员分享,可在线阅读,更多相关《嵌入式基础:ARM下GCC交叉编译器的制作(15页珍藏版)》请在金锄头文库上搜索。

1、嵌入式基础:ARM下GCC交叉编译器的制作1. 下载所需文件以下是我在Cygwin环境下制作arm-gcc(uclibc)交叉编译器中所需要的文件:binutils-2.14.90.0.8uClibc-0.9.27gcc-3.4.2linux-libc-headers-2.4.29PS:般来说这里还需要下一些patch,因为我对编译器的理解还不够,加上这个事情是工作内容,还有 些其他的特殊需求,为了省麻烦,我用了一个很龌龊的方法。我将在linux环境下被buildroot打过补丁的 源代码复制出来。注:通常制作交叉编译器的时候,源代码的版本是非常重要的。2. 准备工作$PREFIX为安装目录;

2、$TARGET为目标的体系结构,例如arm-linux;将$PREFIX/$TARGET下的 sys-include 链接到./include 目录;将$PREFIX/$TARGET下的 lib 链接到./lib 目录;将内核头文件中对应的asm (例如asm-arm)和linux目录复制到$PREFIX/include下;修改内核头文件,比如在制作i386-arm交叉编译器时,需要在asm目录下的建立arch,proc对应的目 录;修改环境变量export PATH=$PREFIX/bin:$PATH这个一定要记得,因为制作gcc交叉编译器时,需要用到此bin目录下的交叉二进制工具;接下来这

3、步,是为uclibc库所做的,创$PREFIX/usr目录,将目录中的lib链接到./lib,将目录中的 include 链接到./include;接下来就准备开始制作交叉编译器了,制作交叉编译器一般分四步:制作交叉的二进制工具制作不带库的gcc交叉编译器用制作好的gcc交叉编译器将所需要的库编译重新编译带库的gcc交叉编译器以下是制作交叉编译器的步骤,因为我用的源代码是给 buildroot 打过补丁的,所以制作的参数会和通 常的交叉编译器制作的参数有些不同。3.制作 binutils制作交叉环境的二进制工具:./binutils-2.14.90.0.8/configure -prefix=

4、/staging_dir -target=arm-linux-uclibc -disable-nls-enable-multilib -disable-werrormakemake install4制作gcc交叉编译器./gcc-3.4.2/configure -prefix=/staging_dir -target=arm-linux-uclibc -enable-languages=c-disable-shared -with-sysroot=/sour-uc/uClibc_dev/ -disable-_cxa_atexit -enable-target-optspace-with-gnu

5、-ld -disable-nls -enable-multilibmakemake install注:如果是通常的制作,这里一般需要-without-headers -disable-shared -disable-threads,如果不是 使用 glibc 库,还需要 -with-newlib。5.编译 uclibc 库make menuconfigmake CROSS=arm-linux-uclibc-make PREFIX=/staging_dir install注:在 menuconfig 配置中,Library Installation Options 的参数设置如下:(/lib)

6、Shared library loader path(/) uClibc runtime library directory(/usr/) uClibc development environment directory在/stagi ng_dir/usr目录下会生成in elude和lib两个目录,这两个目录会生成下一步制作gee所需要的 文件,已经被我们链接到相应的目录里去了。如果之前没有把目录链接到安装目录下的lib和in elude中, 则下步编译gee会出现许多错误,比如找不到crt?.o等等。6重新制作gee交叉编译器./gcc-3.4.2/configure-prefix二/st

7、aging_dir-target二armlinuxuclibcenablelanguages=cenableshareddisable_cxa_atexitenabletargetoptspacewithgnuld disablenlsenablemultilibmakemake install./gee-3.4.2/eonfigure-prefix=/staging_dir-target=arm-linux-uelibe-enable-languages=e-enable-shared-disable-_exa_atexit-enable-target-optspaee-with-gnu-l

8、d -disable-nls-enable-multilibmakemake install如果不出现编译错误,那么恭喜你,你距离成功就仅有一小步了。为什么这么说,因为你的gee的spees 文件可能还需要做一点简单的修改,因为编译的时候可能会遇到一些错误。比如我制作arm 开发经验笔记前一段时间做了 arm的一些开发,主要是编写了 arm的启动软件和移植了 uCOS-II到arm7。我做事情 喜欢深入简出,及从最简单,最原理的方面先做一个框架,然后在这个框架里面进行补充。我还是一个很喜欢 和别人讨论的人,希望有人可以给我提出意见和建议。我的这个心得很初级,都是一些基本的东西。现在拿出 来和大

9、家分享,希望在我毕业之前能给大家留一些纪念。人_人由于这些东西发 paper 实在是没有价值,但是我感觉可以作为 arm 开发的入门。由于我的水平和经验有限, 错误也是难免的。但是如果不拿出来和大家分享, 就算有错误我也发现不了,是么?呵呵。我现试试发连载 的第一篇,看看有多少价值,如果大家觉得有价值,我会继续连载的。5前言这个文档是我学习ARM编程的总结和心得。阅读这个文档的人应当首先阅读ADS1.2的帮助文档及相关内 容。这个文档不会对编译器及连接器做出详细的说明, 在需要的时候会指出具体内容在相关资料的章节。 同时阅读这个文档的人需要了解ARM指令集和一些ARM汇编的基本内容以及C和C+

10、的相关编程内容。 同时还需要了解ARM的流水线结构及一些基本的编程知识。同时为了方便查阅英文文档,所有的相关术语 都使用英文原文 第一章 STARTUP1 ARM 的启动一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程以创造嵌入式程序运行的环境,尤其是 一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言C,C+甚至 JAVA语言,都需要先创建一个适合程序运行的硬件环境,然后初始化或者配置或者剪裁run-time library,这 些工作都必须在主程序运行前完成,所以一个startup程序或者程序组对于一个嵌入式系统来说是非常重要 的。要编写start

11、up程序,需要对编译器、链接器和汇编器的细节有一定的了解,同时对ARM芯片硬件本身 的地址分配以及memory mapping机制也需要有一些了解。2 ARM 程序的工作过程首先由各种source file经过编译产生object文件,然后object文件经过链接生成Image文件,然后通过ICE 的方法,根据描述文件的指定下载到目标板上的固态存储器指定地址当中,比如flash,EEPROM, ROM等等。 在程序执行之前,根据某些描述文件,将需要读写数据的部分读出放入动态存储器比如RAM当中,然后程序 从ROM开始执行。或者有时为了提高程序的运行速度,也可以将所有的程序(有一些root的部分

12、除外,以后 会提及)通过一个描述文件放入指定的RAM当中,然后程序从RAM开始执行,但是这样会耗费大量的动态存 储器,所以大部分程序会取折中的方法,将需要快速运行的部分和要读写的部分放入RAM中(一般读固态存 储器的过程和动态存储器的过程是一样的,但是写就不同了,所以读写的部分一定要放到RAM中),而只读的 部分和对速度要求不是那么高的部分放入固态存储器。同时ARM结构的异常向量表规定放在地址为 0x00000000开始的地址空间上,而一般的CPU为了提高异常相应速度,会将这个向量段remap到其他的 RAM当中,所以在描述文件当中必须精确指定异常向量跳转程序的地址到remap的地方。在app

13、lication程 序执行前,还需要由一些文件描述 application 程序执行的环境。比如系统工作时钟,总线频率。现在一般嵌 入式编程语言为C,C+等。如果在使用它们的时候使用的run time-library,那么在程序执行前还需要为这些 库函数初始化heap。然后ARM可能工作在不同的模式,还需要为不同的工作模式设置stack。这样,描述链 接地址的文件,以及在application运行前所有的初始化程序就是startup程序组3 STARTUP 分类这样,将startup程序所完成的功能分类。一类是链接地址描述,一类是各种初始化的程序。根据不同的应用, 描述文件和初始化程序的内容以

14、及结构和复杂程度都会不同。但是基本上,它们都必须实现以下功能。3.1 描述文件实现功能 描述文件可以是链接命令行上简单的几个字符,也可以是一个非常复杂的文件,但是它必须完成如下功能: 指定程序下载的地址指定程序执行的地址3.2 初始化程序实现的功能 初始化程序根据不同的应用,其结构和复杂度也不同,但是它必须完成如下基本功能: 异常向量初始化内存环境初始化其他硬件环境初始化4 描述文件要编写描述文件,必须知道ARM Image文件的组成及ARM Image文件执行的机理。4.1 ARM Image 的结构一个ARM Image structure由linker在以下几个方面定义:组成它的 reg

15、ions 和 output sections当 Image 下载的时候这些 regions 和 sections 在内存中的位置当Image执行时这些regions和sections在内存中的位置4.1.1 ARM Image 的组成一个ARM Image被保存在可执行文件当中,它的层次结构可以包括Image,regio ns,output sectio ns和in put sections。一个Image由一个或多个regio ns组成,每个region包括一个或多个output sectio ns每个output secti on由一个或多个in put secti ons组成In put secti ons 是一个 object file 中的 code 和 data 信息。Image 的结构如下图:NOTE Input section,output section 和 region 的定义见 ADS_LinkerGuide 3-3 页。同时 Input section 有几种属性,分别为 readonly,read-write,zero-initialize

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号