博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

Tekkaman Ninja

Linux我的梦想,我的未来! 专注linux内核和驱动!本博客的原创文章的内容会不定期更新或修正错误! 转载文章都会注明出处,若有侵权,请即时同我联系,我一定马上删除!! 原创文章版权所有!如需转载,请注明出处: tekkman.cublog.cn ,谢谢合作!!!!!
  tekkman.cublog.cn

关于作者
姓名:Tekkaman  Ninja
职业:ARM9+Linux
年龄:25
位置:福建龙岩
个性介绍:钻研嵌入式Linux技术
E-Mail:tekkamanninja@163.com
|| << >> ||
我的分类


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

    这次建立
交叉编译环境我主要参考的资料是:
1、《构建嵌入式Linux系统》
2、《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》
3、
ARM Linux 交叉编译 工具链 制作攻略
4、
AT91RM9200引导程序的建立--------建立交叉编译工具链


   Host CPU:i686
        RAM: 768MB
        OS: Fedora 7

   TARGET CPU :ARM9TDMI
          OS : Linux-2.6.22.2/2.6.15.4

    我在Fedora7下快速、成功地建立ARM-Linux交叉编译环境,是看了嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》中关于crosstool的介绍。
    crosstool是由美国人Dan Kegel(毕业于加(利福尼亚)州工学院)开发的一套可以自动编译不同匹配版本gcc和glibc,并作测试的脚本程序。写这篇文章时的最新版本是0.43。
    在http://kegel.com/crosstool/crosstool-0.43/buildlogs/可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。
    你也可以到http://kegel.com/crosstool/#download看看是否有更新的版本。
     
    第一步:保证你装Fedora7时,安装了需要的软件开发工具。在 ARM Linux 交叉编译 工具链 制作攻略》中说:“0、制作之前确保你的机子上有如下几个工具:bison、flex、build-essential。   我的机子上有bison和flex,至于build-essential是包含一个在建立deb包过程中起关键作用的包的信息列表,Fedora下并不需要。
 
   第二步:下载crosstool,并解压到你的工作目录。  

tar -xzvf crosstool-0.43.tar.gz
cd crosstool-0.43

 
   第三步:察看crosstool文件夹中,可以看到目录下有很多.sh脚本和.dat配置文件。找到你要交叉编译的CPU所对应的脚本,如我要交叉编译的CPU是S3C2410A,则选用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}目录下。注意:不要解压!
 
以下是 ARM Linux 交叉编译 工具链 制作攻略》介绍的可下载源码包的中国镜像站点(我并没都试过):

这一步可以省略,因为如果运行demo-arm9tdmi.sh 时在${TARBALLS_DIR}目录下没有相应的源码包,会自动下载其.bz2源码包。但是建议事先用下载工具下好,这样更省时间。

根据《构建嵌入式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内核都顺利结束,且移植U-boot1.2.0、Linux2.6.22.2、busybox1.9.0和其他的驱动或应用程序都十分顺利,从没出过错!下载到S3c2410和S3c2440的开发板上(2.6.22.2内核)测试,都没问题。证明编译出的程序绝对可用


补:在Fedora 8 下建立 ARM-Linux 交叉编译环境

Host    CPU:AMD 3000+ (X86-64)
        RAM: DDR400 1GB (双通道)
        OS: Fedora 8

同样使用crosstool-0.43,因为没有新的版本(截止2008年1月24日)强烈希望Dan Kegel能出新的版本!

我在http://kegel.com/crosstool/crosstool-0.43/buildlogs/上看到arm9tdmi平台的交叉编译器最新的成功组合为

gcc-4.1.1
cgcc-3.3.6
glibc-2.3.2
binutils-2.16.1
linux-2.6.15.4
hdrs-2.6.12.0

我回来看了看去年我在f7下做gcc-4.1.0还不是最新的,而且现在的内核已经是linux-2.6.24,所以决定重做交叉编译器。

我对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/tekkamanninja/embeddedLinux/ARM-Linux_source
RESULT_TOP=/home/tekkamanninja/embeddedLinux/crosstool-4.1.1
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
eval `cat arm9tdmi.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh --notest --gdb

echo Done.

 
如果要使用GDB调试应用程序的话,记得要在后面加上--gdb,这样Crosstool会一同帮你编译出arm-9tdmi-linux-gnu-gdb、arm-9tdmi-linux-gnu-gdbtui和gdbserver(开发板用的)。省得以后还要单独去编译。

然后修改gcc-4.1.1-glibc-2.3.2.dat :

BINUTILS_DIR=binutils-2.16.1
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.1.1
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.24.2
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2
GDB_DIR=gdb-6.5


然后下载相应的bz2包到 TARBALLS_DIR文件夹,最后进入crosstool-0.43目录,输入./demo-arm9tdmi.sh,最后经过不到一个小时,编译成功!!!!



网友反馈:

1、有位网友按以上的方法做,碰到了如下错误提示:

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

原因是他用root登录编译,后来他以普通用户登录,就成功了!

所以我在这里再次建议:在嵌入式开发时,最好以普通用户登录,这样Host系统会比较安全。《构建嵌入式Linux系统》里也是这样建议的!!!

2、有位网友碰到了如下错误提示:

......

crosstool: glibc refuses to build if LD_LIBRARY_PATH is set. Please unset it before running this script.

问题的解决办法:

在shell中输入:

unset LD_LIBRARY_PATH

类似的问题也可这么解决的!



发表于: 2007-08-16,修改于: 2008-03-01 14:22,已浏览3000次,有评论14条 推荐 投诉


网友评论
网友: timeboy 时间:2007-12-11 13:40:27 IP地址:202.107.226.★
请问我运行脚本后出现
creating libtool
updating cache ./config.cache
loading cache ./config.cache
configure: error: Unrecognized target system type; please check config.sub.
make: *** [configure-bfd] 错误 1
这个问题怎么解决?谢谢

Blog作者的回复:
可能是你的输入命令错了,应该是
./demo-arm9tdmi.sh

它会执行:eval `cat arm9tdmi.dat gcc-4.1.0-glibc-2.3.2-tls.dat` sh all.sh --notest

arm9tdmi.dat 就是定义target system type的文件。


网友: timeboy 时间:2007-12-12 14:56:45 IP地址:202.107.226.★
谢谢,原来是书上打印错了,在选目标target时应该是arm-linux
书上写成了arm-linux-

网友: askabc 时间:2008-02-22 13:51:41 IP地址:221.200.197.★
编译出现问题,请赐教:
编译时出现错误:
checking build system type... i686-pc-linux-gnu
checking host system type... arm-9tdmi-linux-gnu
checking sysdep dirs... sysdeps/arm/elf sysdeps/unix/sysv/linux/arm sysdeps/unix/sysv/linux sysdeps/gnu sysdeps/unix/common sysdeps/unix/mman sysdeps/unix/inet sysdeps/unix/sysv sysdeps/unix/arm sysdeps/unix sysdeps/posix sysdeps/arm/fpu sysdeps/arm sysdeps/wordsize-32 sysdeps/ieee754/flt-32 sysdeps/ieee754/dbl-64 sysdeps/ieee754 sysdeps/generic/elf sysdeps/generic
checking for a BSD-compatible install... /usr/bin/install -c
checking whether ln -s works... yes
checking for pwd... /bin/pwd
checking for arm-9tdmi-linux-gnu-gcc... gcc
checking version of gcc... 4.2.1, bad
checking for gnumake... no
checking for gmake... gmake
checking version of gmake... 3.81, ok
configure: error:
*** These critical programs are missing or too old: gcc
*** Check the INSTALL file for required versions.

我是在SUSE 10.3下编译的,GCC版本是4.2.1,为啥还“checking version of gcc... 4.2.1, bad”呢?


网友: askabc 时间:2008-02-22 15:38:36 IP地址:221.200.115.★
问题解决了……
原来问题就是出在SUSE自带的GCC 4.2上……貌似版本太高。换用GCC 3.4.6就编译通过了~

Blog作者的回复:
谢谢你了!我又学到一个经验。


网友: 本站网友 时间:2008-03-25 15:37:58 IP地址:218.249.29.★
请问ftp方法如何用呢?

Blog作者的回复:
请问你说的是U-boot的tftp,还是Linux的ftp服务??
Linux的ftp服务:http://blog.chinaunix.net/u1/34474/showart_508920.html


网友: he428 时间:2008-04-02 15:29:51 IP地址:222.76.226.★
请问这里可以用下面这种组合吗?
BINUTILS_DIR=binutils-2.18
GCC_CORE_DIR=gcc-3.3.6
GCC_DIR=gcc-4.3.0
GLIBC_DIR=glibc-2.6
LINUX_DIR=linux-2.6.24.4
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.5
GDB_DIR=gdb-6.8

Blog作者的回复:
我没试过,但是几乎是不可能的,除了内核之外,gcc和glibc等的版本一般不改,因为自动编译的时候会对特定版本的软件打补丁。


网友: onroad826 时间:2008-04-12 18:20:04 IP地址:61.187.179.★
你好,谢谢的帮助,我按你所说方式建立好交叉编译环境后,我裁剪内核时在Makefile文件里修改cross_compile=              路径如何指定,谢谢

Blog作者的回复:
兄台,这和你编译器的目录在哪有关,我也不知怎么设定你的路径啊


网友: Noir 时间:2008-05-09 23:38:46 IP地址:123.115.140.★
您好,我按您的方法成功编译了工具链,tmp目录下也有halloworld程序,但是我想请问您如何测试我的工具链呢?我是个初学者,还请您指教。

Blog作者的回复:
将tmp目录下也有halloworld程序放到开发板上运行,如果可以运行,基本说明你的工具链是ok的!更进一步就是用你的工具链来编译内核和bootloader,成功后在开发板上运行,如果可以运行说明你的工具链99%以上是没问题了。


网友: FM365 时间:2008-05-16 01:49:24 IP地址:218.80.114.★
老师,你好!在制作中为什么会突然说:File gdb-6.5.tar.bz2 not found,然后终止.我绝对把所有的.BZ2文件都放进去了啊.

Blog作者的回复:
我觉得可能是手误,你仔细看看两个文件名是否一致!!


网友: FM365 时间:2008-05-17 00:24:25 IP地址:218.80.114.★
通过网络下载方式解决了,谢谢

网友: hubo214 时间:2008-05-28 14:29:02 IP地址:218.1.119.★
我遇到了和网友askabc相同的问题,就是gcc的版本过高,我的是gcc-4.2.3.系统是ubuntu8.04,请问我该怎么操作把它改成较低的版本呢?谢谢!

网友: hubo214 时间:2008-05-31 20:56:09 IP地址:218.1.119.★
问题已经解决

网友: 本站网友 时间:2008-06-10 15:35:17 IP地址:125.216.249.★
您好:
  我照着你上面写的一步一步做下去,在解压完以后,碰到一个这样的问题,请问知道怎么修改吗?
      checking sizeof long long ... configure:error,cannot determine a size for long long
      make:***[configure-bfd]error 1
      除了kernel是linux-2.6.tar.bz2以外,其它的我都用的是上面介绍的版本,另外,在之前我手动安装的时候也是到这一步就进行不下去了,敬请指教


网友: 本站网友 时间:2008-06-10 18:21:02 IP地址:125.216.249.★
上面我的kernel是linux-2.6.16.tar.bz2

 发表评论