当前位置:首页 >> 信息与通信 >>

基于ARM的交叉编译工具的制作


Vol. 9 No . 2 第9卷  2期 第 太 原 师 范 学 院 学 报 ( 自然科学版)       J un. 2010 2010 年 6 月   J OU RNAL O F TA IYUAN NORMAL UN IV ERSIT Y (Nat ural Science Edition)

3

基于 A RM 的交叉编译工具的制作
李胜琴   张国荣     许 岩
( 西北师范大学 数学与信息科学学院 ,甘肃 兰州 730070)

   摘要〕 交叉编译就是在一个平台生成可以在另一个平台执行的代码 , 它作为嵌入式系统开 〔   发的前提和准备 ,具有相当重要的作用 . 文章利用 Co sstool 脚本工具集 , 详细说明了基于 A RM 和
Linux 的嵌入式系统的交叉编译环境的建立方法 , 并给出了具体的步骤 . 实验结果表明 , 可以在 x86 平台编译调试 A RM 平台上运行的程序 .

〔 关键词〕 A RM ;Linux ; 嵌入式系统 ; 交叉编译环境   〔 文章编号〕 167222027 (2010) 0220056204   中图分类号〕 T P311. 52   文献标识码〕 A   〔   〔  

0  引言

[1]

在进行嵌入式开发时 ,需要建立交叉编译环境 ,其目的在于使用普通的 PC 作为宿主机来调试目标开发
. 在进行嵌入式系统的开发时 ,运行程序的目标平台通常只有有限的存储空间和运算能力 , 其一般的静

态存储空间比较小 . 针对这样的硬件环境 ,在 A RM 平台上进行本机编译就不太可能 , 交叉编译工具的出现 正好解决了这一问题 . 目前常见的制作交叉编译工具链的方法有以下两种 : 1 ) 分步编译 Binutil s , GCC ,
Glibc [ 2 ] . 这样做难度比较大 ,通常不容易成功 . 2) 采用 Cro sstool [ 3 ] 脚本工具一次编译生成 , 这种方法对于研

发嵌入式系统来说非常有用 .

1  交叉编译基础知识

交叉编译就是在一个平台上生成可以在另一个平台上执行的代码 . 这里的平台 , 实际上包含两个概念 : 体系结构 ,操作系统 . 同一体系结构可以运行不同的操作系统 . 同样 ,同一个操作系统也可以在不同的体系结 构上运行 . 我们常说的 x86 Linux 平台实际上是 Intel x86 体系结构和 Linux for x86 操作系统的简称 , 而 x86 WinN T 平台实际上是 Intel x86 体系结构和 Window s N T for x86 操作系统的简称 [ 4 ] . 交叉编译工具是嵌入式开发的基础 ,完善的工具链可以保证项目开发的进度和质量 [ 5 ] . 因此本文根据自 己的硬件和软件需求搭建适合自己的工具链 ,这一步对于以后的开发是相当重要的 . 为了实现在 Linux 环境 下编程 ,必须首先构建嵌入式 Linux 系统下的交叉编译开发环境 . 交叉编译环境 ,一般是由编译器 、 连接器和解释器组成的开发环境 . 它的主要特征是某机器中执行的程 序代码不是在本机编译生成 ,而是由另一台机器编译生成 ,一般把前者称为目标机 ,后者称为宿主机 . 目标机 设备处理器能力和存储空间有限 ,即单独在目标板上无法完成程序的开发 ,所以只好借助于宿主机 . 在宿主 机上编译好适合目标机运行的代码后 ,通过宿主机到目标机的调试通道将代码下载到目标机 ,然后由运行于 宿主机的调试软件控制代码在目标机上运行调试 .

2   Linux 操作系统下建立交叉编译开发环境的具体步骤 在
2. 1   准备源文件

准备源文件 ,如表 1 所示 .

3收稿日期 :2010203205     作者简介 : 李胜琴 (19842) ,女 ,河南信阳人 ,西北师范大学在读硕士研究生 ,主要从事嵌入式系统研究 .

  2 期               第 李胜琴等 : 基于 A RM 的交叉编译工具的制作 表1  源文件
Fig. 1   urce file So Cro sstool20. 43. tar. gz gcc24. 0. 2. tar. gz glibc22. 3. 6. tar. gz binutils22. 16. 1. tar. bz2

57

脚本工具集 Binutils 工具包
Gcc 编译器 Glibc 库 Glibc 套件 Linux 内核 Libc 头文件

http :/ / kegel. co m/ cro sstool http :/ / ftp . gnu. o rg/ gnu/ binutils/ binutils22. 16. 1. tar. bz2 http :/ / ftp . gnu. o rg/ gnu/ gcc/ gcc24. 0. 2. tar. gz http :/ / ftp . gnu. o rg/ gnu/ glibc http :/ / ftp . gnu. o rg/ gnu/ glibc/ glibc22. 3. 6. tar. gz http :/ / ep09. pld2linux. o rg/ ~ mmazur/ linux2libc2headers

   值得说明的是 ,在做交叉编译工具链之前检查系统是否安装了 biso n ,flex. 本交叉编译工具软件环境是 fedora 8. 0. Cro sstool 是一组脚本工具集 ,能够很方便地编译自己的交叉编译环境 , 目前最新的版本是 Cro sstool2 0. 43. 它可构建和测试不同版本的 GCC 和 Glibc , 用于那些支持 Glibc 的体系结构 . 它是一个开源项目 , 用 Cro sstool 构建交叉工具链要比分步编译容易得多 ,并且也方便许多 . Binutils 主要是二进制代码的处理维护 工具 ; GCC 则用来要生成 ( Arm2Linux2 Gcc) 交叉编译工具 ,是主要的编译处理工具 ; Glibc 是个 C 库 ,几乎所 有的应用程序都需要共享它提供的功能 ( 除了 kernel , bootload 和其他完全不用 C 库的功能代码 ) , 因此 Glibc 的存在有利于小系统或嵌入系统缩减系统总代码尺寸与存放空间 ( 尽管单个的 Glibc 库是比较大的) . 它主要是提供用户程序所使用的一些库文件 . 2. 2   创建编译环境 这个过程中 , 将设置一些环境变量 , 创建安装目录 , 安装 Linux 内核源代码和头文件 , 取得 Binutil s , GCC , G1ibc 的源码 , Glibc 是一个提供系统调用和基本函数的 C 语言库 ,比如 open ,malloc 和 p rintf 等 ,所有 动态链接的程序都要用到它 . 这里需要注意的是 , Glibc 和内核源代码的版本必须与目标机上实际使用的版 本保持一致 ,具体操作步骤如下 : mkdir / ho me/ lsq/ cro ss 这是在登录的用户目录下面建立 cro ss 目录 ( 不要以 root 用户登录 ) . 其中 l sq 是 Linux 用户名 . 第二步是将 Cro sstool20. 43. tar . gz 复制到/ ho me/ l sq/ cro ss 目录并解压缩具体命令如下 : cp cro sstool20. 43. tar . gz / ho me/ l sq/ cro ss cd / ho me/ l sq/ cro ss tar 2zxvf cro sstool20. 43. tar . gz 以此类推 ,将其他文件按照相同的方式一起复制到/ ho me/ l sq/ cro ss 目录下 ,并解压缩 . 2. 3   进入 Cro sstool20. 43 目录对相关文件进行修改 a : 修改 arm. dat ,具体内容如下 : KERN EL CON FIG =‘pwd arm. co nfig ‘/ TA R GE T = arm2linux # 生成交叉编译工具的头文件 . TA R GE T_CFL A GS =“2O ” b : 修改 demo2arm. sh : cd cro sstool20. 43 cd demo2arm. sh vi arm. sh 修改 arm. sh 的脚本内容如下 ,其中 # 后面的内容是注释 . TA RBALL S_D IR = / ho me/ l sq/ cro ss             # 下载的源码包存放的路径 R ESUL T_ TO P = / ho me/ l sq/ cro sstool # 交叉编译工具链安装的路径 export TA RBALL S_D IR R ESUL T_ TO P GCC_L AN GUA GES =“c ,c + + ” # 定义支持 c c + + 语言 export GCC_L AN GUA GES
mkdir 2p $R ESUL T_ TO P

linux22. 6. 26. tar. gz

linux2libc2headers22. 6. 12. 0. tar. bz2

glibc2linuxt hreads22. 3. 6. tar. gz

http :/ / ftp . kernel. org/ p ub/ kernel/ v2. 6/ linux22. 6. 26. tar. gz

58

太 原 师 范 学 院 学 报 ( 自然科学版)                 第 9 卷  

用 export 声明的变量是临时变量 ,当我们更换了控制台 ,这些环境变量就不存在了 ,如果下次重新使用 这些变量就需要重新定义 ,如果感觉这样很麻烦 ,可以在 bashrc 文件中定义这些变量 ,该文件包含专用于你 的 bash shell 的 bash 信息 ,当 bash shell 打开时 ,该文件被读取 . 当更换控制台时 ,这些变量就一直有效 . c : 建立配置文件 ,修改 gcc24. 0. 22glibc22. 3. 6. dat 大约一个小时左右在/ ho me/ l sq/ cro sstool 将生成我们需要的交叉编译工具 . 这个时间根据我们系统的 配置不同而有所不同 . 编译完成后会在/ ho me/ lsq/ cro sstool/ gcc24. 0. 22glibc22. 3. 6/ arm2linux/ bin/ 目录下 面有以下文件 : arm2linux2addr2line      2linux2g + +       2linux2ld       2linux2size arm arm arm
+ filt 就是实现这种反向的转化 ,根据标号得到函数名 . N m —— — 列出目标文件的符号和对应的地址 . L d —— — gnu 的连接器 . 目标代码连接 ,连接各目标代码块 ,它是生成可执行代码的最终步骤 . Objcop y —— — 将某种格式的目标文件转化成另外格式的目标文件 . Objdump —— — 现实目标文件的信息 . Gcov —— — 查看代码覆盖率 . 2. 5   添加环境变量 2. 4   执行 . / demo2arm. sh 脚本 arm2linux2ar bash. bashrc arm2linux2as arm2linux2c + + arm2linux2gcov arm2linux2gp rof B IN U TIL S_D IR = binutil s22. 16. 1 L INU X_D IR = linux22. 6. 26 GCC_D IR = gcc24. 0. 2 GL IBC_D IR = glibc22. 3. 6 L INU X_SAN I TIZED_ H EAD ER_DIR = linux2libc2header s22. 6. 12. 0 Ar —— — 产生 ,修改和解开一个存档文件 . A s —— — gnu 的汇编器 . 生成汇编程序代码 . Readelf —— — 显示 elf 格式的目标文件的信息 . Gp rof —— — 显示程序调用段的各种数据 . Size —— — 显示目标文件各个字节的大小和目标文件的大小 . St rip —— — 剥掉目标文件的所有的符号信息 . Addr2line —— — 将你要找的地址转换成文件和行号 ,它要使用 debug 信息 . C + + filt —— + + 和 J ava 中有一种重载函数 , 所用的重载函数最后会被编译转化成汇编的标号 ,c + —c Ranlib —— — 为一个存档文件产生一个索引 ,并将这个索引存入存档文件中 . St rings —— — 打印出目标文件中可以打印的字符串 ,有个默认的长度为 4.

添加此行 ,这是我们要编译的交叉编译工具的版本 eval ‘cat arm. dat gcc24. 0. 22glibc22. 3. 6. dat‘ sh all . sh —— — notest t
echo Do ne.

命令如下 : cd / etc        # 进入目录 l s 3 . bashrc # 会出现这个下面这个文件

GL IBC T HR EADS_ FIL ENAM E = glibc2linuxt hreads22. 3. 6 arm2linux2gcc arm2linux2gcc24. 0. 2 arm2linux2gccbug arm2linux2ranlib arm2linux2readelf

arm2linux2nm

arm2linux2o bjcop y arm2linux2cpp

arm2linux2o bjdump

fix2embedded2pat hs arm2linux2c + + filt

arm2linux2st rings arm2linux2st rip

  2 期               第 李胜琴等 : 基于 A RM 的交叉编译工具的制作

59

vi bash. bashrc

编辑 bash. bashrc ,将生成的编译工具链路径添加到 PA T H 上去 , 添加的方法是在系统/ etc/ 3 . bashrc 文件的最后添加命令 : export PA T H = / ho me/ l sq/ cro sstool/ gcc24. 0. 22glibc22. 3. 6/ arm2linux/ bin : $PA T H 2. 6   测试交叉编译工具 下面通过一个简单的程序测试刚刚建立的交叉编译工具链看是否能够正常工作 . 写一个最简单 hello . c 源文件 ,内容如下 :
# include < st dio . h > int main ( ) { file hello

( )    rintf “Hello ,world ! \ n” ; p    urn 0 ; ret } 通过以下命令进行编译 ,编译后生成名为 hello 的可执行文件 ,通过 file 命令可以查看文件的类型 . 当显 示以下信息时表明交叉工具链正常安装了 ,通过编译生成 A RM 体系可执行的文件 . 注意 , 通过该交叉编译 链编译的可执行文件只能在 A RM 体系下执行 ,不能在基于 x86 体系结构的普通 PC 上执行 . arm2linux2gcc – o hello hello . c

dynamically linked ( uses shared libs) ,not st ripped

我们的交叉编译环境就已经完成好了 . 如果在交叉编译中出现错误 ,请检查 :1) 是否安装了相应的补丁 . 2) 系统环境变量是否设置正确 . 3 ) 库文件路径设置是否正确 .

3  结束语

本文主要介绍了一种建立基于 A RM 和 Linux 的交叉编译环境的方法 , 整个跨平台开发工具链已经完 成 ,可以直接在非 A RM 的 PC 平台上编写 、 编译和链接基于 A RM 的程序 ,也可以根据本文的方法编译其他 平台自己需要的交叉编译器 . 参考文献 :
[ 1 ]     ,于德海 ,马明龙 . 基于 ARM 的嵌入式 Linux 的交叉环境的建立 [J ] . 科技信息 ,2009 (25) :1162117 张 瑞 [2]   蓝炳伟 ,王   . 构建嵌入式 Linux 应用开发环境 [J ] . 网络安全技术与应用 ,2008 (2) :57258 涛 [3]   郭秋平 . 基于 ARM 系统的 Linux 平台移植研究 [ D ] . 杭州 : 浙江大学 ,2006 [4]   孙纪坤 ,张小全 . 嵌入式 Linux 系统开发技术详解 [ M ] . 北京 : 人民邮电出版社 ,2006 [5]   王晓惠 . 基于 ARM2linux 的交叉编译环境的创建 [J ] . 电脑知识与技术 ( 学术交流) ,2007 (15) :7872788

   Abstract〕 Cro ss co mpiler means t he co des t hat generate o n o ne platform and can run o n 〔   anot her platform. A s t he p reco nditio n and p reparatio n of develop ment of embedded system ,it plays an important role. Taking advantage of cro sstool scripting tool s , t he paper al so explained t he establishing met ho d based o n A RM and cro ss2co mpilatio n enviro nment of Linux embedded systems in detai ,t hen t he specific step s were given. The experimental result co nforms t hat in X86 platform t he sof t ware developer can co mpile and debug p rogram which runs o n A RM platform. 〔Key words〕 A RM ;Linux ;embedded system ;cro ss2co mpilatio n enviro nment  

hello : EL F 322bit L SB executable ,A RM ,ver sio n 1 ( A RM ) ,for GN U/ Linux 2. 4. 18 , Li Shengqin  Zhang Guorong  Xu Yan

( College of Mat hematics and Informatio n Science ,Nort hwest Normal U niversity ,Lanzhou 730070 ,China)

The Production of Cross2Compilation Tools Based on ARM

【责任编辑 : 王映苗】


相关文章:
实验3-4 交叉编译工具arm-linux-gcc的制作
实验3-4 交叉编译工具arm-linux-gcc的制作_计算机软件及应用_IT/计算机_专业资料。实验 3-4 交叉编译工具 arm-linux-gcc 的制作 【实验目的】 ? 掌握交叉编译...
交叉编译器的制作
交叉编译器的制作_IT/计算机_专业资料。本文详细介绍了在嵌入式领域,arm微处理器上搭建交叉编译器的全过程。GCC 交叉编译器制作 做嵌入式开发少不了跨平台操作, ...
使用crosstool-ng制作交叉编译工具
使用crosstool-ng制作交叉编译工具_计算机软件及应用_IT/计算机_专业资料。cross...如 arm-yourname-linux-gnueabi 这样的编译器前缀 修改好以后就可以开始编译了...
搭建arm交叉编译环境
生成内核 编译完成之后在 linux-2.6.32.17/arch/arm/boot/目录下的 zImage 为编译的内核文件。 8 三 使用交叉编译工具制作根文件系统 1. 准备 busybox 源码 ...
ARM-Linux交叉编译环境完全手册_图文
陶瓷,2010,(03):50-52 [14] 李胜琴,张国荣,许岩.基于 ARM 的交叉编译工具的制作[J].太原师范学院学报 (自然科学版),2010,(02):56-59 [15] 刘二钢 . ...
Ubuntu下安装ARM交叉编译器
By:xiaofeige Ubuntu 下安装 ARM 交叉编译器 1、下载文件: 安装包:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 下载地址 http://pan.baidu.com/s/1i31c3Kp...
构建ARM Linux交叉编译工具链
本章的目的是讲述建立基于 ARM 平台的交叉工具链,所以目标平台名为 arm-linux-...方法三 直接通过网上(ftp.arm.kernel.org.uk)下载已经制作的交叉 编译工具链...
ARM、linux常用服务器+交叉编译工具链
ARM、linux常用服务器+交叉编译工具链_计算机软件及应用_IT/计算机_专业资料。1...全手工制作arm-linux交叉... 8页 1下载券 嵌入式linux交叉编译工具... 34页...
arm-linux交叉编译环境的建立
基于ARM和Linux的交叉编译... 4页 免费 基于ARM-...编译安装 gcc 的 c 编译器 解压缩 o o o o o...如果你是第一次制作 arm-linux 交叉编译环境,强烈建议...
arm-linux-gcc交叉编译工具链安装
arm-linux-gcc交叉编译工具链安装_工学_高等教育_教育专区。arm-linux-gcc交叉编译工具链安装arm-linux-gcc 交叉编译工具链安装 交叉编译工具链安装陈伟 解压 arm-...
更多相关标签: