arm-linux-gcc(4.6.1)交叉編譯工具鏈的建立

本文參考文獻:

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

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,趕快試試吧!:-)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章