参考链接:
步骤:
1.保证你的ubuntu9.04下安装了以下软件开发工具
Bison,flex,build-essential,patch,libncurses5-dev
我并没有试过没装这些工具的后果,都是网上的经验,你要是不信这个邪,就自己吃吃这个螃蟹
2.编译器选择
因为ubuntu9.04自带的是gcc-4.3.x无法用crosstool正常编译交叉编译器,所以必须安装gcc-4.1,但是不必卸载原有的4.3.x。
可以用新立得软件包管理器安装gcc-4.1,或者直接在终端输入:
sudo apt-get install gcc-4.1
然后:
sudo rm /usr/bin/gcc (删除GCC,它只是个到gcc-4.3.2的软连接文件) sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc (建立GCC到gcc-4.1的软连接)
交叉工具链编译完成后可以运行以下命令修改回来
sudo rm /usr/bin/gcc sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
3. Shell的选择
如果你运行
ls -la /bin/sh
命令看到/bin/sh其实是一个指向dash的软链接,则请运行以下命令,将/bin/sh链接到bash。
sudo mv /bin/sh /bin/sh.old sudo ln -sf bash /bin/sh
4. crosstool方案选择
参考http://kegel.com/crosstool/crosstool-0.43/buildlogs/的结果,选择如下方案
crosstool-0.43 gcc-3.3.6 gcc-4.1.1 glibc-2.3.2 binutils-2.16.1 linux-libc-headers-2.6.12.0 linux-2.6.27.6
修改demo-arm9tdmi.sh、gcc-4.1.1-glibc-2.3.2.dat,最后运行demo-arm9tdmi.sh.
修改 crosstool-0.43 目录下 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/downloads RESULT_TOP=/home/pino/crosstool //这两行是需要修改的参数,TARBALLS_DIR是下载的工具源码压缩包的存放目录。 //RESULT_TOP是要生成的工具链的存放目录,一定要改到有写权限的目录,不然无法编译。 //以上是我的修改,他人可以根据实际情况修改。 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 //上面表示要选工具链的版本号!"#"起注释功能!可以选择一行! //这行是默认的工具链的版本号(最新的),我就是用这一行,也可以选别的。 echo Done.
根据你所选的工具链的版本号,打开相应的.dat文件,例如:我在demo-arm9tdmi.sh中选的是eval `cat arm9tdmi.dat gcc-4.1.1-glibc-2.3.2.dat` sh all.sh –notest ,那么我就打开arm9tdmi.dat 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.27.6 //此处为修改的地方 LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0 GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.2 GDB_DIR=gdb-6.5
5. 执行./demo-arm9tdmi.sh 开始编译
官方提示:
Edit the script if you want to change any of these settings or versions. Then (as root) create the directory /opt/crosstool and make it writable by you, and finally (as yourself) run the demo scrip
该脚本不要用root权限执行,否则会出现一些错误,就使用普通帐号执行
6. 修改环境变量&测试
等待一段不长不短的时间编译就会完成了,编译完成后应该在你所设的工作目录下的 gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin 下找到 arm-9tdmi-linux-gnu-gcc
添加目录 在终端中输入以下命令 sudo gedit /etc/environment
在PATH结尾的分号前添加 Crosstool 的 bin 目录
然后就好了。可以开始测试使用了。测试的方法很简单,随便找个程序源码编译一下就好了。这里用的这些编译器生成的是二进制文件,和平时的gcc生成的可执行文件并不相同。例如我测试时的文件是test.c,
#include<stdio.h> int main() { printf("Hello!"); return 0; }
调用新的arm-linux-gcc来编译:arm-S3C2410-linux-gnu-gcc -o test test.c,这时生成的test文件是一个二进制的可执行文件,并不是我们平时常用的,所以在PC上执行这个文件的话是不行的,系统会提示:bash: ./test: cannot execute binary file。所以不能用这种方法来测试交叉编译是否成功。而应改采用file命令,例如我的是这样的:
file test
结果如下:
test: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.3, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
如果出现这样的结果说明交叉编译环境已经安装成功。