先说明我这里仅是对binutils、gcc、glibc的交叉编译,缺少gdb等以及对整个制作完成的打包整理,可能有些混乱。编译环境是Debian 6.0,使用的头文件内核linux2.6.32,编译是带EABI的,在交叉工具链编译(上)中主要将制作过程一介绍,在下中将说明原因、遇到的些错误及解决方法。
(1)准备工作源码包:
gmp-4.3.2.tar.gz ftp://ftp.gnu.org/gnu/gmp
mpfr-3.0.1.tar.gz ftp://ftp.gnu.org/gnu/mpfr
glibc-ports-2.11.tar.bz2 ftp://ftp.gnu.org/gnu/glibc
binutils-2.18.tar.bz2 ftp://ftp.gnu.org/gnu/binutils
gcc-4.4.5.tar.gz ftp://ftp.gnu.org/gnu/gcc
glibc-2.11.1.tar.bz2 ftp://ftp.gnu.org/gnu/gcc
linux-2.6.32.tar.bz2 http://download.chinaunix.net/download.php?id=31468&ResourceID=6156
----最近kernel.org上不去,只好从这里下了。
安装一些必备的东西
aptitude install build-essential automake bison flex texinfo gawk g\+\+
aptitude remove mawk
apt-get install libncurses*
目录
build-tools 存放源码及编译文件夹
--build-binutils binutils
--build-gcc gcc
--build-glibc glibc
--build-required gmp、mpfr、glibc-ports
--build-gcc-final 最后的gcc
kernel linux内核源码,包括下载的没有修改过的和
测试使用的是mini2440提供的内核linux2.6.32.2
tools 安装目录设置环境变量
export TARGET=arm-none-linux-gnueabi
export PREFIX=/opt/arm_linux/tools
export PATH=$PATH:$PREFIX/bin
安装gmp、mpfr
gmp
tar xvf gmp-4.3.2.tar.gz 在gmp安装目录下
./configure --prefix=$PREFIX
make
make check
make install
mpfr
./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX
make
make check
(2)编译binutils
解压源码包到build-binutils,建立编译文件夹
makdir build
./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared
make configure-host
make
make install
(3)生成内核头文件
在解压好的目录下
配置
make ARCH=arm COROSS_COMPILE=arm-linux- menuconfig
make ARCH=arm COROSS_COMPILE=arm-linux-
----不管错误,只是生成需要的头文件
建立include及链接
mkdir -p $PREFIX/include
cd $PREFIX/include
ln -s /opt/arm_linux/kernel/linux-2.6.32/arch/arm/include/asm asm
ln -s /opt/arm_linux/kernel/linux-2.6.32/include/linux linux
ln -s /opt/arm_linux/kernel/linux-2.6.32/include/asm-generic asm-generic
(4)初编译gcc
配置
----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
mkdir build
../configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-shared --with-mpfr=$PREFIX --with-gmp=$PREFIX --without-headers --with-newlib --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --enable-languages=c --disable-multilib --with-abi=aapcs
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc
(5)编译c库
配置
----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
mkdir build
cd build
CC=$TARGET-gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons --with-binutils=$PREFIX/bin --with-headers=$PREFIX/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
编译
cd $PREFIX/lib/gcc/$TARGET/4.4.5
ln -s libgcc.a libgcc_eh.a
make make PREFIX=/opt/arm_linux install
(6)第二次编译gcc
修正
cd $PREFIX/arm-none-linux-gnueabi
rm lib include -rf
ln -s ../lib lib
ln -s ../include include
配置
../build-gcc/gcc-4.4.5/configure --prefix=$PREFIX --target=$TARGET --disable-nls --enable-shared --enable-languages=c,c++ --enable-c99 --enable-long-long --disable-multilib --enable-__cxa_atexit --with-gmp=$PREFIX --with-mpfr=$PREFIX
如果想能够编译u-boot等,针对2440的可以加上--with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t 即可。然后make makeinstall
7.测试
可以直接写个helloworld,用arm-none-linux-gnueabi-gcc编译一下,然后使用file命令查看其属性,我这里是把mini2440提供的内核解压,然后将makefile中的cross-compile的arm-linux-换成现在的arm-none-linux-gnueabi-,make zImage,找到内核下载到板子上,部分信息如下:
load Image of Linux...Uncompressing Linux................................................................................................................................................................. done, booting the kernel.
Linux version 2.6.32.2-FriendlyARM (root@debian6) (gcc version 4.4.5 (GCC) ) #2 Fri Sep 23 17:09:08 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM Mini2440 development board
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
好了,只要按着做,应该就有自己的编译器了,不过很多配置我现在也不太清楚,主要就是参考下面的文章,以及碰到错误搜索下了,如果按照次不能成功请留言。。。。。。。。。。。。。别急,后面会简单看下碰到什么问题以及怎样解决的。
【参考】
1.交叉工具链制作至尊宝典 http://blog.csdn.net/turui/article/details/6596093
2.如何为嵌入式开发建立交叉编译环境 https://www.ibm.com/developerworks/cn/linux/l-embcmpl/
3.Cross-Compiled Linux From Scratch - Embedded http://cross-lfs.org/view/clfs-embedded/arm/index.html
4.自己动手制作交叉编译工具链 http://hi.baidu.com/mynana/blog/item/479eb25183ec2210377abee0.html