[转]玩转S3C6410之一 交叉工具链制作(gcc4.5.1-armv6-vfp)
软件平台:ubuntu 11.10(按照本人博客中“玩转Ubuntu-11.10”系列的文章进行安装)
主机编译器: gcc 4.6.1
硬件平台:tiny6410
1、准备环境
必备工具包:bison、flex、texinfo、automake、libtool、cvs、patch、libncurses5-dev、aria2、curl、g++、svn、gawk、cvsd、subversion
(有些文章有写要安装gcj,在我的Ubuntu11.10安装不了,提示说它被其它的软件包引用了,可能是我之前装的其他工具已经包含gcj了把)
我们可以通过以下一条命令来获得它们,但需要ubuntu11.10接入网络
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install texinfo
sudo apt-get install automake
sudo apt-get install libtool
sudo apt-get install cvs
sudo apt-get install patch
sudo apt-get install libncurses5-dev
sudo apt-get install aria2
sudo apt-get install curl
sudo apt-get install g++
sudo apt-get install subversion
sudo apt-get install gawk
sudo apt-get install cvsd
2、下载crosstool-ng软件包
crosstool-ng的下载地址是
http://ymorin.is-a-geek.org/download/crosstool-ng/
值得注意的是,下载里面最新的crosstool-ng以后,记得在到
http://ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/
看看有没有相应的补丁,有得话一起下载下来,并打上补丁,
本人于2011.11.21下载了2011.11.20更新的1.13.2版本,当时没有补丁。
3、安装crosstool-ng
解压crosstool-ng-1.13.2.tar.bz2,进入目录,进行配置:
sudo ./configure --prefix=/home/tiny6410/crosstool/crosstool-install
配置安装目录为/home/tiny6410/crosstool/crosstool-install
sudo make --编译
sudo make install --安装
4、配置编译的交叉编译工具链
sudo mkdir /home/tiny6410/crosstool/crosstool-build --建立编译目录
sudo cd /home/tiny6410/crosstool/crosstool-build --进入编译目录
sudo cp /home/tiny6410/crosstool/crosstool-ng-1.13.2/samples/arm-unknown-linux-gnueabi/* ./
sudo cp crosstool.config .config --把crosstool-config --当作默认的配置文件
sudo /home/tiny6410/crosstool/crosstool-install/bin/ct-ng menuconfig --图形界面进行配置
弹出以下菜单,此菜单主要用于交叉编译工具链的环境配置。
Paths and misc options --->
(/home/tiny6410/crosstool/src-4.5.1) Local tarballs directory --源码目录
(/usr/local/arm/4.5.1) Prefix directory --最后生成的交叉编译工具链存放的目录
(2) Number of parallel jobs --主机是双核处理器的可以选2
Target options --->
(armv6) Architecture level
(arm1176jzf-s) Emit assembly for CPU
(arm1176jzf-s) Tune for CPU
(vfp) Use specific FPU
Toolchain options --->
(none) Tuple's vendor string
Operating System --->
Linux kernel version (2.6.36.4) --->
//再高一点的版本如2.6.38制作好的编译器在编译qtopia2.2.0的时候会报include\linux下没有videodev.h这个头文
件,低一些的版本如3.6.28在交叉编译的时候会报scripts/unifdef.c中的getline和系统/usr/include
/stdio.h中的getline冲突
Binary utilities --->
binutils version (2.19.1a) --->
C compiler --->
gcc version (4.4.6) ---> //等下再修改成4.5.1
[ ] Fortran
[ ] Java
C-library --->
glibc version (2.9) --->
Debug facilities --->
[ ] gdb --->
Companion libraries --->
GMP version (4.3.2) --->
MPFR version (2.4.2) --->
PPL version (0.10.2) --->
CLooG/ppl version (0.15.10) --->
libelf version (0.8.13) --->
保存退出。
vi .config
将
CT_CC_VERSION="4.4.6"
改成
CT_CC_VERSION="4.5.1"
将
CT_CC_V_4_4_6=y
改成
CT_CC_V_4_5_1=y
在
CT_MPFR=y
后面增加一行
CT_MPC=y
在
CT_MPFR_VERSION="2.4.2"
后面增加两行
CT_MPC_V_0_8_2=y
CT_MPC_VERSION="0.8.2"
保存退出。
5、编译交叉工具链
编译的时候会自动下载下面的软件包,也可以自己先下载好放在src-4.5.1目录下,这样编译的是时候就比较快了。
binutils-2.19.1a.tar.bz2
duma_2_5_15.tar.gz
glibc-2.9.tar.bz2
libelf-0.8.13.tar.gz
mpfr-2.4.2.tar.xz
strace-4.5.19.tar.bz2
cloog-ppl-0.15.10.tar.gz
expat-2.0.1.tar.gz
glibc-ports-2.9.tar.bz2
ltrace_0.5.3.orig.tar.gz
ncurses-5.9.tar.gz
dmalloc-5.5.2.tgz
gcc-4.5.1.tar.bz2
gmp-4.3.2.tar.bz2
mpc-0.8.2.tar.gz
ppl-0.10.2.tar.bz2
linux-2.6.36.4.tar.xz
在终端执行
sudo /home/tiny6410/crosstool/crosstool-install/bin/ct-ng build --开始编译
编译了两个小时左右,不过很庆幸的是没出现错误(其实我试了很多次了)。接下看下成果。
sudo cd usr/local/arm/4.5.1/bin/
sudo ./arm-none-linux-gnueabi-gcc -v
打印如下信息:
Using built-in specs.
COLLECT_GCC=./arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/4.5.1/libexec/gcc/arm-none-linux-gnueabi/4.5.1/lto-wrapper
Target: arm-none-linux-gnueabi
Configured with: /home/tiny6410/crosstool/crosstool-build/.build/src/gcc-4.5.1/configure --build=i686-build_pc-linux-gnu --
host=i686-build_pc-linux-gnu --target=arm-none-linux-gnueabi --prefix=/usr/local/arm/4.5.1 --with-
sysroot=/usr/local/arm/4.5.1/arm-none-linux-gnueabi/sysroot --enable-languages=c,c++ --disable-multilib --with-arch=armv6 --with-
cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=soft --with-pkgversion='crosstool-NG 1.13.2' --disable-sjlj
-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-
gmp=/home/tiny6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-
mpfr=/home/tiny6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-
ppl=/home/tiny6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-
cloog=/home/tiny6410/crosstool/crosstool-build/.build/arm-none-linux-gnueabi/build/static --with-host-libstdcxx='-static-libgcc -
Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --with-local-prefix=/usr/local/arm/4.5.1/arm-
none-linux-gnueabi/sysroot --disable-nls --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.5.1 (crosstool-NG 1.13.2)
接下来将命令都链接成arm-linux-,这样以后操作比较方便。
sudo ln -s arm-none-linux-gnueabi-addr2line arm-linux-addr2line
sudo ln -s arm-none-linux-gnueabi-ar arm-linux-ar
sudo ln -s arm-none-linux-gnueabi-as arm-linux-as
sudo ln -s arm-none-linux-gnueabi-c++ arm-linux-c++
sudo ln -s arm-none-linux-gnueabi-c++filt arm-linux-c++filt
sudo ln -s arm-none-linux-gnueabi-cpp arm-linux-cpp
sudo ln -s arm-none-linux-gnueabi-g++ arm-linux-g++
sudo ln -s arm-none-linux-gnueabi-gcc arm-linux-gcc
sudo ln -s arm-none-linux-gnueabi-gcc-4.5.1 arm-linux-gcc-4.5.1
sudo ln -s arm-none-linux-gnueabi-gccbug arm-linux-gccbug
sudo ln -s arm-none-linux-gnueabi-gcov arm-linux-gcov
sudo ln -s arm-none-linux-gnueabi-gprof arm-linux-gprof
sudo ln -s arm-none-linux-gnueabi-ld arm-linux-ld
sudo ln -s arm-none-linux-gnueabi-ldd arm-linux-ldd
sudo ln -s arm-none-linux-gnueabi-nm arm-linux-nm
sudo ln -s arm-none-linux-gnueabi-objcopy arm-linux-objcopy
sudo ln -s arm-none-linux-gnueabi-objdump arm-linux-objdump
sudo ln -s arm-none-linux-gnueabi-populate arm-linux-populate
sudo ln -s arm-none-linux-gnueabi-ranlib arm-linux-ranlib
sudo ln -s arm-none-linux-gnueabi-readelf arm-linux-readelf
sudo ln -s arm-none-linux-gnueabi-size arm-linux-size
sudo ln -s arm-none-linux-gnueabi-strings arm-linux-strings
sudo ln -s arm-none-linux-gnueabi-strip arm-linux-strip
到此arm-linux-gcc4.5.1-armv6-vfp交叉编译器制作完成,以后就可以用arm-linux-gcc来编译其他程序了。