arm-linux-gcc(4.6.1)交叉编译工具链的建立
本文参考文献:http://cross-lfs.org/view/clfs-sysroot/arm/cross-tools/chapter.htmlhttp://blog.chinaunix.net/uid-436750-id-2123570.html感谢youbest的深刻分析!感谢Google!(额,怎么不感谢百度呢? 你懂的。。。)本文的疏漏和不足之处,还请大家慷慨指出,共同
本文参考文献:
http://cross-lfs.org/view/clfs-sysroot/arm/cross-tools/chapter.html
http://blog.chinaunix.net/uid-436750-id-2123570.html
感谢youbest的深刻分析!感谢Google!(额,怎么不感谢百度呢? 你懂的。。。)
本文的疏漏和不足之处,还请大家慷慨指出,共同学习!
注:容易出错的部分用红色字体标出。如需转载,请注明出处。:-)
用到的源码包:
binutils-2.21.1a.tar.bz2
glibc-ports-2.13.tar.bz2
glibc-linuxthreads-2.5.tar.bz2
glibc-2.14.tar.bz2
gmp-5.0.2.tar.bz2
mpc-0.9.tar.gz
gcc-4.6.1.tar.bz2
linux-3.2.13.tar.xz
设置环境:
export PREFIX=/usr/local/arm/4.6.1
export TARGET=arm-linux-gnueabi
export PATH=$PREFIX/bin:$PATH
1. 编译内核头文件
tar xf linux-3.2.13.tar.xz
cd linux-3.2.13
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
mkdir -pv $PREFIX/usr/include/
cp -av dest/include/* $PREFIX/usr/include/
find $PREFIX/usr/include -name .install -or -name ..install.cmd | xargs rm -fv
2. binutils
tar xf binutils-2.21.1a.tar.bz2
mkdir binutils-build
cd binutils-build
../binutils-2.21.1/configure --prefix=$PREFIX \
--target=$TARGET --with-sysroot=$PREFIX \
--disable-nls --enable-shared --disable-multilib
make configure-host
make && make install
cp ../binutils-2.21.1/include/libiberty.h $PREFIX/usr/include -v
3. glibc-haeders
tar xf glibc-2.14.tar.bz2
cd glibc-2.14/
tar xf ../sources/glibc-ports-2.13.tar.bz2
mv glibc-ports-2.13/ ports
tar xf ../sources/glibc-linuxthreads-2.5.tar.bz2
cp configure{,.org} -v
sed -e 's/3.4/3.[0-9]/g' configure.org > configure
mkdir ../glibc-build
cd ../glibc-build
以下强制配置很重要:
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
echo "libc_cv_arm_tls=yes" >> config.cache
echo "install_root=$PREFIX" > configparms
CC=gcc ../glibc-2.14/configure --prefix=/usr \
--host=$TARGET --with-headers=$PREFIX/usr/include --cache-file=config.cache
make install-headers
cp -v bits/stdio_lim.h $PREFIX/usr/include/bits/
touch /usr/local/arm/4.6.1/usr/include/gnu/stubs.h
4. gcc first pass
tar xf gcc-4.6.1.tar.bz2
cd gcc-4.6.1
tar xf ../sources/mpfr-3.0.1.tar.bz2
mv mpfr-3.0.1/ mpfr
tar xf ../sources/gmp-5.0.2.tar.bz
mv gmp-5.0.2/ gmp
tar xf ../sources/mpc-0.9.tar.gz
mv mpc-0.9/ mpc
mkdir ../gcc-build
cd ../gcc-build
../gcc-4.6.1/configure --prefix=$PREFIX \
--target=$TARGET --disable-multilib --with-sysroot=$PREFIX \
--disable-nls --disable-shared --enable-languages=c
必须编译ligbcc
make all-gcc && make install-gcc
make all-target-libgcc && make install-target-libgcc
5. glibc
rm -rf glibc-build
mkdir glibc-build
cd glibc-build
修改两处源码,否则会出现 “TLS_DTV_UNALLOCATED”未申明的错误。
vi ../glibc-2.14/nptl/allocatestack.c
vi ../glibc-2.14/elf/dl-tls.c
增加定义
#define TLS_DTV_UNALLOCATED ((void *) -1l)
增加ligcc_eh.a链接,否则会出现“找不到库libgcc_eh”的错误
ln -sv $PREFIX/lib/gcc/arm-linux-gnueabi/4.6.1/libgcc.a $PREFIX/lib/gcc/arm-linux-gnueabi/4.6.1/libgcc_eh.a
同样,强制配置:
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
echo "install_root=$PREFIX" > configparms
BUILD_CC="gcc" CC="$TARGET-gcc" \
AR="$TARGET-ar" RANLIB="$TARGET-ranlib" \
../glibc-2.14/configure --prefix=/usr --libexecdir=/usr/lib/glibc \
--host=$TARGET --disable-profile --enable-add-ons \
--with-tls --enable-kerne=2.6.0 --with-__thread \
--with-binutils=$PREFIX/bin --with-headers=$PREFIX/usr/include \
--cache-file=config.cache
这里,必须先make all ,然后才能make install,否则有可能会出现 "无法创建目标libdl.so“的错误
make all
make install
如果到这里没有什么问题,基本上就很顺利了。:-)
6. gcc final
rm -rf gcc-build
mkdir gcc-build
cd gcc-build
../gcc-4.6.1/configure --prefix=$PREFIX --target=$TARGET \
--disable-multilib --with-sysroot=$PREFIX --disable-nls \
--enable-shared --enable-languages=c,c++ \
--enable-__cxa_atexit --enable-c99 --enable-long-long \
--enable-threads=posix
make
make installl
好,搞定!新鲜出炉的 arm-linux-gcc-4.6.1,赶快试试吧!:-)
更多推荐
所有评论(0)