分享

arm-linux-gcc(4.6.1)交叉编译工具链的建立

 guitarhua 2014-05-22

本文参考文献:

http:///view/clfs-sysroot/arm/cross-tools/chapter.html

http://blog./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

mpfr-3.0.1.tar.bz2
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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多