Linux ARM交叉编译环境

给大家推荐一款很不错的Linux ARM系统很有学习价值,这里我主要讲解Linux ARM系统的应用,包括介绍Linux ARM知识等方面。在 Fedora 下建立 Linux ARM交叉编译环境。

这几天忙着在Fedora 7下建立Linux ARM的交叉编译环境。一开始参考了《构建嵌入式Linux系统》,这是一本很经典的书。上面介绍了建立Linux ARM的交叉编译环境的许多知识,建立的原则和方法。我一开始想按照上面的一般方法,建立一个自己的、最新的交叉编译环境。但是,试了才知道这个过程是一个繁琐、耗时的工作。对于没有编译原理知识的我来说,更是耗时又毫无意义。引用《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》的原话:在这项工作上浪费时间似乎没有任何意义,我也是这么认为的, 由于在公司做事,时间不多,最后,我利用crosstool0.43,自动完成了这项工作。在是否有必要自己建立交叉编译环境的问题上,我建议:如果你是一个学生,建议你认真学习编译原理、LinuxGNU的编译器原理,再一步一步的自己建立交叉编译环境(学生比较有时间,少泡MM,少玩游戏,时间就挤出来了。好好学习,以后MM来泡你,别人玩你编的游戏。如果你是程序员(不是交叉编译器的开发者),建议不要在这上面浪费时间了,赚钱要紧,把这个作为业余爱好吧!

这次建立 交叉编译环境我主要参考的资料是:
1
、《构建嵌入式Linux系统》
2
、《嵌入式设计及Linux驱动程序开发指南——基于Linux ARM处理器(第2版)》

3
、《 Linux ARM交叉编译 工具链 制作攻略

4
、《 AT91RM9200引导程序的建立--------建立交叉编译工具链

Host CPUi686
RAM: 768MB
OS: Fedora 7
TARGET CPU :ARM9TDMI
OS : Linux-2.6.22.2/2.6.15.4

我在Fedora7下快速、成功地建立Linux ARM交叉编译环境,是看了《嵌入式设计及Linux驱动程序开发指南——基于Linux ARM9处理器(第2版)》 中关于crosstool的介绍。crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gccglibc,并作测试的脚本程序。写这篇文章时的最新版本是0.43

http://kegel.com/crosstool/crosstool-0.43/buildlogs/ 可以看到各种CPUGCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。你也可以到http://kegel.com/crosstool/#download 看看是否有更新的版本。

第一步:保证你装Fedora7时,安装了需要的软件开发工具。在《 Linux ARM交叉编译 工具链 制作攻略 》中说:“0、制作之前确保你的机子上有如下几个工具:bisonflexbuild-essential ”    我的机子上有bisonflex 至于build-essential是包含一个在建立deb包过程中起关键作用的包的信息列表,Fedora下并不需要。

第二步:下载crosstool,并解压到你的工作目录。    tar -xzvf crosstool-0.43.tar.gz cd crosstool-0.43

第三步:察看crosstool文件夹中,可以看到目录下有很多 .sh 脚本和 .dat 配置文件。找到 你要交叉编译的CPU 所对应的脚本,如我要交叉编译的CPUS3C2410A,则选用 demo-arm9tdmi.sh 。以下是其内容和所需的修改: #!/bin/sh
# This script has one line for each known working toolchain
# for this architecture. Uncomment the one you want.
# Generated by generate-demo.pl from buildlogs/all.dats.txt
set -ex

TARBALLS_DIR= /home/tekkaman/working/source RESULT_TOP= /home/tekkaman/working/crosstool这两行是需要修改的参数,TARBALLS_DIR是下载的工具源码压缩包的存放目录。RESULT_TOP是要生成的工具链的存放目录,一定要改到有写权限的目录,不然无法编译。如用root登录进行编译,可能 会出错,详情请见后记!以上是我的修改,他人可以根据实际情况修改。

export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES= "c,c++"
export GCC_LANGUAGES
# Really, you should do the mkdir before running this ,
# and chown / opt/ crosstool to yourself so you don 't need to run as root.
mkdir -p $RESULT_TOP

#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.2.3-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.3.6-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.2.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.2-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.5-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.0.2-glibc-2.3.6-tls.dat` sh all.sh --notest
#eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest 
上面表示要选工具链的版本号!""起注释功能!可以选择一行!这行是默认的工具链的版本号(最新的),我就是用这一行,也可以选别的。 echo Done. 

第三步(可选):根据你所选的工具链的版本号,打开相应的.dat文件,察看所需的源码包,并下载到 ${TARBALLS _DIR} 目录中  

例如:我在demo-arm9tdmi.sh 选的是eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest  ,那么我就打开 arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat ,其内容如下:
BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.0
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.15.4 
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5
GLIBC_EXTRA_CONFIG="$GLIBC_EXTRA_CONFIG --with-tls --with-__thread  --enable-kernel=2.4.18" 

到网上去下载红色标记的.bz2 源码包 ,注意其版本号 ,下载后存放到${TARBALLS_DIR} 目录下。注意:不要解压!

根据《构建嵌入式Linux系统》 中的介绍,如果为不同的内核编译交叉编译工具,交叉编译工具要根据其内核重新编译过。由于我想使用最新的2.6.22.2 内核,所以在编译完以上配置的工具链后,我将“LINUX_DIR=linux-2.6.15.4  ”改成“LINUX_DIR=linux-2.6.22.2  ”,并下载linux-2.6.22.2.tar.bz2 ${TARBALLS_DIR} 目录下, 重新编译了一次。

最后一步: 进入crosstool-0.43目录,输入./demo-arm9tdmi.sh ,然后就是泡茶、看书。经过不到3小时的编译(公司的烂电脑所用的时间,配置好的可以更快),就可以在${RESULT_TOP } 目录中看到想要的工具链、头文件、库文件等文件了, ${RESULT_TOP }/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/tmp 文件夹中有 Hello,world!测试程序 。一般不会失败, 我编了2.6.15.4内核和2.6.22.2内核都顺利结束,且移植Uboot1.2.0Linux2.6.22.2busybox1.9.0和其他的驱动或应用程序都十分顺利,从没出过错!下载到S3c2410S3c2440的开发板上(2.6.22.2内核)测试,都没问题。证明编译出的程序 绝对可用。

你可能感兴趣的:(linux,工具,嵌入式,程序开发,编译器,gcc)