首页 核心课程 师资团队 就业实训 企业培训 承接项目 技术文章 在线学习 我要报名 关于我们 “顶嵌杯”专题
分类导航
课件下载 
模拟试卷 
视频下载 
动手做一个嵌入式产品活动之:第一部分
文件名称: 动手做一个嵌入式产品活动之:第一部分
文件大小:
文件类型: rar
上传时间: 2009-09-05 15:30:58
更新时间: 2009-09-05 15:30:58
下载次数: 442
适用年级:
作者姓名:
文件简介
动手做一个嵌入式产品活动之:第一部分
详细介绍
第一阶段:工具链编译;
构建ARM平台的交叉工具链
Crosstool 是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动
编译不同匹配版本gcc 和glibc,并作测试的脚本程序。Crosstool 最初是为嵌入式系统开发
者创建,但也适用于主流开发者比如只是希望他们去快速编译或需要建立程序,可运行在旧
版本的Linux 操作系统(例如Red Hat 的6.2 )。Crosstool 是一种便携式的shell 脚本。你可
以使用它来建立Linux 系统配置的编译器是运行在Linux , Mac OS X 操作系统, Solaris
和Cygwin 等。它支持的硬件平台有:alpha, arm, i686, ia64, mips, powerpc, powerpc64, sh4,
sparc, sparc64, s390, x86_64 等。
在实践之前,我们需要回答这样的问题,为什么要使用交叉编译器?主要原因是嵌入式
硬件(目标机)的性能一般都无法满足开发环境的要求,比如主频比较低、内存少、没有硬
盘(常用FLASH 作为存储设备)、没有大型显示设备、没有全键盘等。交叉编器通常是采
用PC(x86)作为主机来搭建开发环境进行编译,但编译出的软件能够在特定CPU 体系架构
的目标设备(比如ARM 设备)上运行的一套编译工具。
下面将以具体操作步骤来讲述Crosstool 构建针对ARM 平台的交叉编译器。注:该实
验是基于Fedora 10 操作系统下进行,其他Linux 发行版可能会有所不同。
1.准备资源文件
首先从网上下载上述资源文件:binutils-2.15.tar.bz2,gcc-3.4.5.tar.bz2,glibc-2.3.6.tar.bz2 ,
glibc-linuxthreads-2.3.6.tar.bz2,linux-2.6.28.2.tar.bz2 和linux-libc-headers-2.6.12.0.tar.bz2。然
后将这些工具包文件放在开放主机的/home/mike/downloads 目录(该目录根据个人使用习惯
不同可修改)下,最后在/home/mike 目录下解压crosstool-0.43.tar.gz,命令如下:
2 建立脚本文件
接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近
的脚本文件demo-arm.sh 作为模版,然后将该脚本的内容复制到arm.sh,修改arm.sh 脚本,
具体操作如下:
修改后的arm.sh 的脚本内容如下:
软件包名称下载站点
crosstool-0.43.tar.gz
http://kegel.com/crosstool/crosstool-0.43.tar.gz
binutils-2.15.tar.bz2 http://ftp.gnu.org/gnu/binutils/
gcc-3.4.5.tar.bz2 http://ftp.gnu.org/gnu/gcc
glibc-2.3.6.tar.bz2 http://ftp.gnu.org/gnu/glibc
glibc-linuxthreads-2.3.6.tar.bz2 http://ftp.gnu.org/gnu/glibc
linux-2.6.28.2.tar.bz2 http://ftp.kernel.org/pub/linux/kernel/v2.6/
linux-libc-headers-2.6.12.0.tar.bz2 http://ep09.pld-linux.org/~mmazur/linux-libc-headers/
# cd /home/mike
# tar –xvzf crosstool-0.43.tar.gz
# cd crosstool-0.43
# cp demo-arm.sh arm.sh
# vi arm.sh
#!/bin/sh
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
3 建立配置文件
在arm.sh 脚本文件中需要注意arm.dat 和gcc-3.4.5-glibc-2.3.6.dat 两个文件,这两个文
件是作为crosstool 的编译的配置文件。其中arm.dat 文件内容如下,主要用于定义配置文件,
定译生成编译工具链的名称以及定义编译选项等。
gcc-3.4.5-glibc-2.3.6.dat 文件内容如下,该文件主要定义编译过程中所需要的库以及它
定义的版本,如果当在编译过程中发现有些库不存在时,crosstool 会自动在相关网站上下载,
该工具在这点上相对非常智能,也非常有用。
4 执行脚本
将Crosstool 的脚本文件和配置文件准备好之后,开始执行arm.sh 脚本来编译交叉变异
工具。具体执行命令如下:
经过数小时的漫长编译之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin 目录
下生成新的交叉编译工具,其中包括以下内容:
5 添加环境变量
然后将生成的编译工具链路径添加到环境变量PATH 上去,添加的方法是在系统~/
.bash_profile 文件中添加下面一行在文件的最后,如图所示。
set -ex
TARBALLS_DIR=/home/mike/downloads # 定义工具链源码所存放位置。
RESULT_TOP=/opt/crosstool # 定义工具链的安装目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++" # 定义支持C, C++语言
export GCC_LANGUAGES
# 创建/opt/crosstool 目录
mkdir -p $RESULT_TOP
# 编译工具链,该过程需要数小时完成。
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
echo Done.
KERNELCONFIG=`pwd`/arm.config # 内核的配置
TARGET=arm-linux # 编译生成的工具链名称
TARGET_CFLAGS="-O" # 编译选项
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6
LINUX_DIR=linux-2.6.28.2
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
# cd crosstool-0.43
# ./arm.sh
arm-linux-addr2line arm-linux-g++ arm-linux-ld arm-linux-size
arm-linux-ar arm-linux-gcc arm-linux-nm arm-linux-strings
arm-linux-as arm-linux-gcc-3.4.5 arm-linux-objcopy arm-linux-strip
arm-linux-c++ arm-linux-gccbug arm-linux-objdump fix-embedded-paths
arm-linux-c++filt arm-linux-gcov arm-linux-ranlib
arm-linux-cpp arm-linux-gprof arm-linux-readelf
export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
图用Vi 编辑器在.bash_profile 文件中添加环境变量
设置完环境变量,也就意味着交叉编译工具链已经构建完成,然后就可以进行测试刚刚
建立的工具链,在命令行输入arm-linux-gcc 看是否有输入文件提示,如果有说明交叉编译
器已经安装好。
实践出现的问题及解决方法:
问题一:执行.arm.sh 出现如下权限错误?
[root@localhost crosstool-0.43]# ./arm.sh
+ TARBALLS_DIR=/home/mike/downloads
+ RESULT_TOP=/opt/crosstool
+ export TARBALLS_DIR RESULT_TOP
+ GCC_LANGUAGES=c,c++
+ export GCC_LANGUAGES
+ mkdir -p /opt/crosstool
++ cat arm.dat gcc-3.4.5-glibc-2.3.6.dat
+ eval 'KERNELCONFIG=`pwd`/arm.config' TARGET=arm-linux 'TARGET_CFLAGS="-
O"' BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.5 GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.28.2 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 sh all.sh --notest
+++ pwd
++ KERNELCONFIG=/home/mike/crosstool-0.43/arm.config
++ TARGET=arm-linux
++ TARGET_CFLAGS=-O
++ BINUTILS_DIR=binutils-2.15
++ GCC_DIR=gcc-3.4.5
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
解决办法:
++ GLIBC_DIR=glibc-2.3.6
++ LINUX_DIR=linux-2.6.28.2
++ LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
++ GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
++ sh all.sh --notest
You set both LINUX_DIR and LINUX_SANITIZED_HEADER_DIR - ignoring
LINUX_DIR for the build
DEJAGNU not set, so not running any regression tests
GCC_EXTRA_CONFIG not set, so not passing any extra options to gcc's configure script
GLIBC_ADDON_OPTIONS not set, so building all glibc add-on's
+ TOOLCOMBO=gcc-3.4.5-glibc-2.3.6
++ pwd
+ BUILD_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
++ pwd
+ TOP_DIR=/home/mike/crosstool-0.43
+ test -z ''
+ SRC_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
+ echo 'SRC_DIR not set, so source tarballs will be unpacked in the build directory'
SRC_DIR not set, so source tarballs will be unpacked in the build directory
+ abort 'Don'\''t run all.sh or crosstool.sh as root, it'\''s dangerous'
+ echo 'Don'\''t' run all.sh or crosstool.sh as root, 'it'\''s' dangerous
Don't run all.sh or crosstool.sh as root, it's dangerous
+ exec false
[root@localhost crosstool-0.43]#
[root@localhost crosstool-0.43]# su mike //切换到普通用户mike
[mike@localhost crosstool-0.43]$ ./arm.sh
+ TARBALLS_DIR=/home/mike/downloads
+ RESULT_TOP=/opt/crosstool
+ export TARBALLS_DIR RESULT_TOP
+ GCC_LANGUAGES=c,c++
+ export GCC_LANGUAGES
+ mkdir -p /opt/crosstool
++ cat arm.dat gcc-3.4.5-glibc-2.3.6.dat
+ eval 'KERNELCONFIG=`pwd`/arm.config' TARGET=arm-linux 'TARGET_CFLAGS="-
O"' BINUTILS_DIR=binutils-2.15 GCC_DIR=gcc-3.4.5 GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.28.2 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 sh all.sh --notest
+++ pwd
++ KERNELCONFIG=/home/mike/crosstool-0.43/arm.config
++ TARGET=arm-linux
++ TARGET_CFLAGS=-O
++ BINUTILS_DIR=binutils-2.15
++ GCC_DIR=gcc-3.4.5
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
问题二:S3C2440 芯片没有硬件浮点数(hardfloat),很多软件只能采用软件浮点数(softfloat)
的编译器编译,恰巧现在高版本的u-boot 只能采用支持softfloat 的交叉编译器编译,否则会
++ GLIBC_DIR=glibc-2.3.6
++ LINUX_DIR=linux-2.6.28.2
++ LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
++ GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
++ sh all.sh --notest
You set both LINUX_DIR and LINUX_SANITIZED_HEADER_DIR - ignoring
LINUX_DIR for the build
DEJAGNU not set, so not running any regression tests
GCC_EXTRA_CONFIG not set, so not passing any extra options to gcc's configure script
GLIBC_ADDON_OPTIONS not set, so building all glibc add-on's
+ TOOLCOMBO=gcc-3.4.5-glibc-2.3.6
++ pwd
+ BUILD_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
++ pwd
+ TOP_DIR=/home/mike/crosstool-0.43
+ test -z ''
+ SRC_DIR=/home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
+ echo 'SRC_DIR not set, so source tarballs will be unpacked in the build directory'
SRC_DIR not set, so source tarballs will be unpacked in the build directory
+ test -w /tmp
+ TARBALLS_DIR=/home/mike/downloads
+ RESULT_TOP=/opt/crosstool
+ PREFIX=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux
+ export TOOLCOMBO
+ export PREFIX
+ export BUILD_DIR
+ export SRC_DIR
+ export TARBALLS_DIR
+ export TOP_DIR
+ '[' 1 -gt 0 ']'
+ opt_no_test=1
+ shift
+ '[' 0 -gt 0 ']'
+ test '' = 1
+ test '' = ''
+ test '' = 1
+ test -d /home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
+ mkdir -p /home/mike/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6
mkdir: cannot create directory `/home/mike/crosstool-0.43/build': Permission denied
[mike@localhost crosstool-0.43]$ su
Password:
[root@localhost crosstool-0.43]# ./arm.sh
北京顶嵌开源科技有限公司
WWW.TOP-E.ORG 400-661-5264 专注嵌入式Linux技术
在编译结束前的链接那一步出现不支持softfloat 的错误。
解决办法:要解决这个错误的唯一办法就是采用支持softfloat 的交叉编译器编译uboot。
下面来说一下制作softfloat 的具体过程。
和上述制作交叉编译器过程一样,不同之处: 1.修改arm.dat 内容如下,参考armsoftfloat.
dat 内容修改。
编译完之后,会在/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux/bin 生成支持softfloat
的交叉编译器,如下所示。
KERNELCONFIG=`pwd`/arm.config
TARGET=arm-softfloat-linux
TARGET_CFLAGS="-O"
GCC_EXTRA_CONFIG="--with-float=soft"
GLIBC_EXTRA_CONFIG="--without-fp"
arm-softfloat-linux-addr2line arm-softfloat-linux-g++ arm-softfloat-linux-ld armsoftfloat-
linux-size arm-softfloat-linux-ar arm-softfloat-linux-gcc
arm-softfloat-linux-nm arm-softfloat-linux-strings arm-softfloat-linux-as armsoftfloat-
linux-gcc-3.4.5 arm-softfloat-linux-objcopy arm-softfloat-linux-strip
arm-softfloat-linux-c++ arm-softfloat-linux-gccbug arm-softfloat-linux-objdump
fix-embedded-paths arm-softfloat-linux-c++filt arm-softfloat-linux-gcov armsoftfloat-
linux-ranlib arm-softfloat-linux-cpp arm-softfloat-linux-gprof armsoftfloat-
linux-readelf
 

嵌入式培训 | 在线报名 | 合作企业 | 关于顶嵌 | 联系我们 | 加入顶嵌 | 友情链接 | 返回顶部

联系电话:010-62640798 62642993 
传真:010-62631735-8900
地址:北京市海淀区紫竹院南路7号院2楼
全国免费咨询电话:400-650-3060
Copyright © 2009 北京顶嵌(TOP-E)开源科技有限公司 - 嵌入式Linux专业培训机构 All Rights Reserved
京ICP06031998

打标机 激光机 二维码