这次建立交叉编译环境我主要参考的资料是:
1、 《构建嵌入式Linux系统》
2、 《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》
3、《 ARM Linux 交叉编译 工具链 制作攻略 》
4、《 AT91RM9200引导程序的建立--------建立交叉编译工具链 》
Host CPU:i686
RAM: 768MB
OS: Fedora 7
TARGET CPU :S3C2410A
RAM :64MB
OS : Linux-2.6.22.2/2.6.15.4
现在进入正题,我在Fedora7下快速、成功地建立ARM-Linux的交叉编译环境,是看了《嵌入式设计及Linux驱动程序开发指南——基于ARM9处理器(第2版)》中关于crosstool的介绍。
tar -xzvf crosstool-0.43.tar.gz
cd crosstool-0.43
# 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
TARBALLS_DIR=/home/tekkaman/working/source
//RESULT_TOP是要生成的工具链的存放目录,一定要改到有写权限的目录,不然无法编译。
//会出错,详情请见后记)
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES
# 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.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
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"
http://www.cn.kernel.org/pub/linux
http://www.cn.kernel.org/pub/software
ftp://ftp.cn.kernel.org/pub/linux
ftp://ftp.cn.kernel.org/pub/software
这一步可以省略,因为如果运行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}目录中看到想要的工具链、头文件、库文件等文件了!一般不会失败,我编了2.6.15.4内核和2.6.22.2内核都顺利结束,且下载到博创2410-S实验箱(2.4.18内核)里测试,证明编译出的Hello,world!程序(在${RESULT_TOP}/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/tmp文件夹中)绝对可用(除了需要库文件的程序,因为2410-S系统中没有相应的库文件无法执行。静态编译的都可用!)!
后记:
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's dangerous
exec false
原因是他用root登录编译,后来他以普通用户登录,就成功了!
所以我在这里再次建议:在嵌入式开发时,最好以普通用户登录,这样Host系统会比较安全。
《构建嵌入式Linux系统》里也是这样建议的!!!