在嵌入式系统移植的过程中,必不可少的一样东西是交叉编译器,只有使用交叉编译器才可以把原先在宿主机(相信大多数人所使用的宿主机会是Linux x86系统的)上所编写的程序交叉编译成开发板(如ARM系统或PPC系统)所识别的二进制形式。 对于一些成熟的移植过程来说,互联网上存在已经制作好的交叉编译器,只要下载过来解压缩配置后就可以使用了。但在使用这些交叉编译器的过程中可能存在着一些问题,由于自己机子上的某些环境不一样,会导致使用这些交叉编译器编译出来的内核,bootloader存在这样或那样的问题。为了去除交叉编译器对今后的编译工作带来的错误影响,最好创建属于自己的交叉编译器。

手动创建交叉编译器相当复杂,对于一般的嵌入式程序开发员来说,这部分知识并不是必须的。幸好我们有Dan Kegel所写的创建交叉编译器的脚本工具crosstool。从crosstool官方网站上下载crosstool的最新版本(0.43之后就再没更新过),解压缩后进入crosstool顶层目录,如下所示,workspace是我的工作目录,Downloads是我的下载目录:

rookiesean@rookiesean-desktop:~/workspace$ tar zxvf ../Downloads/cross-3.4.3.tgz
rookiesean@rookiesean-desktop:~/workspace$ cd crosstool-0.43/

查看crosstool文件夹中,可以看到目录下有很多demo-*.sh脚本和*.dat配置文件。首先需要找到你要交叉编译的平台CPU所对应的demo-*.sh脚本,比如说我要交叉编译的平台是三星的S3C2410,它的CPU是ARM9T,则选用demo-arm9tdmi.sh。对其进行如下修改:

rookiesean@rookiesean-desktop:~/crosstool-0.43$ vim 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/rookiesean/Downloads
RESULT_TOP=/home/rookiesean/temp
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.

TARBALLS_DIR是指创建crosstool过程中所需要的glibc, binutils, gcc等程序的tar.bz2文件所要存放的位置, 这里我把他们放在我的下载目录。crosstool可以自动的从网上下载所需的程序,但由于crosstool在下载的过程中选择的服务器会是国外的官方服务器,会比较慢,最好在build过程之前从网上把这些所需要的文件下载过来放到TARBALLS_DIR中,具体所需要的文件会在下面做介绍。

RESULT_TOP指的是编译好后所生成的交叉编译器存放的目录,一定要改到有写权限的目录,不然无法编译。这里我把他放在我的临时目录中。

eval `cat arm9tdmi.dat gcc-3.4.5-glibc-2.3.6-tls.dat` sh all.sh –notest

表示使用cross-tools顶层目录下的arm9tdmi.dat(根据CPU类型选择)和gcc-3.4.5-glibc-2.3.6-tls.dat(根据想要使用的gcc版本和glibc版本进行选择)来进行交叉编译器的创建。在crosstool官方网站的buildlog页面上可以看到各种CPU和GCC+Glibc版本那些已经编译成功,那些部分成功,那些彻底失败。

在修改好demo-*.sh脚本后,打开所选定的arm9tdmi.dat和 gcc-3.4.5-glibc-2.3.6-tls.dat文件

rookiesean@rookiesean-desktop:~/crosstool-0.43$ vim arm9tdmi.dat

KERNELCONFIG=`pwd`/arm.config
TARGET=arm-9tdmi-linux-gnu
GCC_EXTRA_CONFIG=”–with-cpu=arm9tdmi –enable-cxx-flags=-mcpu=arm9tdmi”
TARGET_CFLAGS=”-O”

这里没什么好修改的。

rookiesean@rookiesean-desktop:~/crosstool-0.43$ vim gcc-3.4.5-glibc-2.3.6-tls.dat

BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.23.8
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

将这里的LINUX_DIR改成你真正想要移植的Linux版本,然后这里的binutils-2.15, gcc-3.4.5, glibc-2.3.6, linux-2.6.23.8, linux-libc-headers-2.6.12.0, glibc-linuxthreads-2.3.6就是你所要下载后放到之前提到的TARBALLS_DIR里的文件(必须是tar.bz2文件)。

最后一步:进入crosstool-0.43目录,输入./demo-arm9tdmi.sh(为免勿操作,crosstool强制使用非root用户才可以运行demo脚本),然后就是泡茶、看书。经过不到1小时的编译,就可以在${RESULT_TOP}目录中看到想要的工具链、头文件、库文件等文件了。

Ubuntu10.04在创建交叉编译器时所遇到的问题及解决方案

4 回应 到 “嵌入式Linux系统移植-使用crosstool创建自己的交叉编译器”

  1. [...] 从crosstool官网上下载解压crosstool后,对demo-*.sh, gcc-*glibc-*.dat脚本进行配置,配置方法参照《嵌入式Linux系统移植-使用crosstool创建自己的交叉编译器》 [...]

  2. [...] 在这里,我们的ARCH是arm, 交叉编译工具链使用《嵌入式Linux系统移植-使用crosstool创建自己的交叉编译器》中生成的交叉编译工具链。 [...]

  3. [...] 所以我们从交叉编译工具链的库文件目录下面拷取以下的文件(自编译交叉工具链的具体操作见《嵌入式Linux移植 – 使用crosstool创建自己的交叉编译器》一文): [...]

  4. 在看了博主的文章之后,解决了很多问题,非常感谢博主的分享精神

回复

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 《洛克.肖恩的救赎》 Suffusion theme by Sayontan Sinha