Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514997
  • 博文数量: 484
  • 博客积分: 10145
  • 博客等级: 上将
  • 技术积分: 5805
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 18:34
文章分类

全部博文(484)

文章存档

2011年(52)

2010年(107)

2009年(287)

2008年(38)

我的朋友

分类: LINUX

2010-05-20 00:33:26

在 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。
    下载地址
    在可 以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。如果你不是编译器开发者,就按着上面做吧。
    你也可 以到看 看是否有更新的版本。
     
    第一 步:保证你装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能出新的版本!

我在上看到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,最后经过不到一个小 时,编译成功!!!!



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

......

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

问题的解决办法:

在shell中输入:

unset LD_LIBRARY_PATH

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


阅读(295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~