编译 交叉编译工具链(ARM)

ARM 159浏览

一:源代码手动编译

1:需要的软件包

binutils:
http://ftp.gnu.org/gnu/binutils/binutils-2.20.tar.gz

glibc:
ftp://ftp.gnu.org/gnu/glibc/glic-2.9.tar.bz2
          (MIPS ARM PowerPC 才需要单独下载glibc,其他体系结构可以使用通用的glibc)

          ftp://ftp.gnu.org/gnu/glibc/glic-ports-2.9.tar.bz2 (解压到上面的glibc的目录里面)

gcc:
 ftp://gcc.gnu.org/pub/gcc/release/gcc-4.4.3/gcc-4.4.3.tar.gz

GMP:
ftp://ftp.gmplib.org/pub/gmp-4.3.1/gmp-4.3.1.tar.bz2

MPFR:
http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.bz2

linux kernel:
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.3.tar.bz2

2: 环境介绍

$SRCDIR       (~/xtools/src) 源代码基础目录

$BINUTILS_SRC ($SRCDIR/binutils) binutils源码

$KERNEL_SRC  目标机的内核源代码位置

$GCC_SRC         ($SRCDIR/gcc) gcc源码

$GLIBC_SRC     ($SRCDIR/glibc) glibc源码

$GMP_SRC        ($SRCDIR/gmp) GMP源码

$MPFR_SRC     ($SRCDIR/mpfr) MPFR源码

$BUILDDIR        (~/xtools/build)  交叉编译工具链的目录

$TARGETMACH   (arm-none-linux-gnueabi) 执行交叉编译工具链的机子(宿主机)

arm-none-linux-gnueabi

CPU:arm mips i686 ppc powerpc

Manufacturer: none,i686对应pc

Operating system:linux

Kernel: gnuabignueabi uclibc

$BUILDMACH   编译交叉工具链的机子,就当前的机子(i686-pc-linux-gcc),不用设置也可以自动设置正常

$INSTALLDIR   (/opt/arm) 交叉编译工具链安装的目录

$SYSROOTDIR  ($INSTALLDIR/sysroot)目标系统所使用的库和头文件的目录

3:编译

$ [ -d $BUILDDIR/binutils ] && rm -fr $BUILDDIR/binutils

$ mkdir $BUILDDIR/binutils

$ cd $BUILDDIR/binutils

$ $BINNUTILS_SRC/configure --disable-werror --build=$BUILDMACH --target=$TARGETMACH --prefix=$INSTALLDIR --with-sysroot=$SYSROOTDIR

$ cd $BUILDDIR/binutils

$ make

$ make install

================================================================

$ cd $KERNEL_SRC

$ make mrproper

$ make ARCH=$TARGETMACH integrator_defconfig      ##  integrator_defconfig是最接近arm通用设备的一个deconfig,当然应该选择一个对应开发板的deconfig

$ mkdir -p $SYSROOTDIR/usr

$ make ARCH=$TARGETMACH headers_check

$ make ARCH=$TARGETMACH  INSTALL_HDR_PATH=$SYSROOTDIR/usr header_install

================================================================

$ [ -d $BUILDDIR/bootstrap-gcc ] && rm -fr $BUILDDIR/bootstrap-gcc

$ mkdir $BUILDDIR/bootstrap-gcc

$ cd $BUILDDIR/bootstrap-gcc

$SRCDIR/$GCC/configure  --build=$BUILDMACH  --host=$BUILDMACH --target=$TARGETMACH --prefix=$INSTALLDIR --without-headers

                                                  --enable-bootstrap --enable-languages="c" --disable-threads --enable__cxa_atexit --disable-libmudflap

                                                  --with-gnu-ld --with-gnu-as --disable-libssp --disable-libgomp --disable-nls --disable-shared

$ make all-gcc install-gcc

$ make all-target-libgcc install-target-libgcc

$ ln -s $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc.a $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc_sh.a

================================================================

$ [ -d $BUILDDIR/libc ] && rm -fr $BUILDDIR/libc

$ mkdir $BUILDDIR/libc 

$ cd $BUILDDIR/libc

$ echo "lib_cv_forced_unwind=yes" > config.cache

$ echo "libc_cv_c_cleanup=yes" >> config.cache

$ export PATH=$INSTALLDIR/bin:$PATH

$ export CROSS=arm-none-linux-gnueabi-

$ export CC=${CROSS}gcc

$ export LD=${CROSS}ld

$ export AS=${CROSS}as

$GLIBC_SRC/configure  --build=$BUILDMACH  --host=$BUILDMACH --target=$TARGETMACH --prefix=$SYSROOTDIR/usr

                                             --with-headers=$SYSROOTDIR/usr/inlcude --config-cache --enable-add-ons=glibc-ports-2.9,nptl --enable-kernel=2.6.0

$ make -k install-headers cross_compling=yes install_root=$SYSROOTDIR

$ ln -s $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc.a $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc_eh.a

================================================================

$ [ -d $BUILDDIR/libc ] && rm -fr $BUILDDIR/libc

$ mkdir $BUILDDIR/libc 

$ cd $BUILDDIR/libc

$ echo "lib_cv_forced_unwind=yes" > config.cache

$ echo "libc_cv_c_cleanup=yes" >> config.cache

$ export PATH=$INSTALLDIR/bin:$PATH

$ export CROSS=arm-none-linux-gnueabi-

$ export CC=${CROSS}gcc

$ export LD=${CROSS}ld

$ export AS=${CROSS}as

$GLIBC_SRC/configure  --build=$BUILDMACH  --host=$BUILDMACH --prefix=/usr  --with-headers=$SYSROOTDIR/usr/inlcude --config-cache

                                             --enable-add-ons=glibc-ports-2.9,nptl --enable-kernel=2.6.0

$ make -k install-headers cross_compling=yes install_root=$SYSROOTDIR

$ ln -s $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc.a $INSTALLDIR/lib/gcc/arm-none-linux-gnueabi/4.4.3/libgcc_eh.a

$ make

$ make install_root=$(SYSROOT) install

================================================================

$ [ -d $BUILDDIR/final-gcc ] && rm -fr $BUILDDIR/final-gcc

$ mkdir $BUILDDIR/final-gcc

$ cd $BUILDDIR/final-gcc

$ echo "lib_cv_forced_unwind=yes" > config.cache

$ echo "libc_cv_c_cleanup=yes" >> config.cache

$ export BUILD_CC=gcc

$SRCDIR/$GCC/configure  --build=$BUILDMACH --target=$TARGETMACH --prefix=$INSTALLDIR --with-sysroot=$SYSROOTDIR --enable-languages=c

                                                   --with-gnu-ld --with-gnu-as --disable-multilib --with-floate=soft --disable-sjlj-exceptions --disable-nls --enable-threads=posix --enable-long-longx

$ make all-gcc install-gcc

================================================================

$ [ -d $BUILDDIR/gmp ] && rm -fr $BUILDDIR/gmp

$ mkdir $BUILDDIR/gmp 

$ cd $BUILDDIR/gmp

$ export PATH=$INSTALLDIR/bin:$PATH

$ export CROSS=arm-none-linux-gnueabi-

$ export CC=${CROSS}gcc

$ export LD=${CROSS}ld

$ export AS=${CROSS}as

$ export CFLAGS=-static

$ $GMP_SRC/configure  --build=$BUILDMACH  --host=$BUILDMACH --prefix=$INSTALLDIR --disable-shared

$ make 

$ make install

================================================================

$ [ -d $BUILDDIR/mpfr ] && rm -fr $BUILDDIR/mpfr

$ mkdir $BUILDDIR/mpfr

$ cd $BUILDDIR/mpfr

$ export PATH=$INSTALLDIR/bin:$PATH

$ export CROSS=arm-none-linux-gnueabi-

$ export CC=${CROSS}gcc

$ export LD=${CROSS}ld

$ export AS=${CROSS}as

$ export CFLAGS=-static

$ $MPFR_SRC/configure  --build=$BUILDMACH  --host=$BUILDMACH --prefix=$INSTALLDIR --with-gmp=$INSTALLDIR

$ make 

$ make install

================================================================

$ [ -d $BUILDDIR/final-gcc-2 ] && rm -fr $BUILDDIR/final-gcc-2

$ mkdir $BUILDDIR/final-gcc-2 

$ cd $BUILDDIR/final-gcc-2

$ echo "lib_cv_forced_unwind=yes" > config.cache

$ echo "libc_cv_c_cleanup=yes" >> config.cache

$ export BUILD_CC=gcc

$SRCDIR/$GCC/configure  --build=$BUILDMACH --target=$TARGETMACH --prefix=$INSTALLDIR --with-sysroot=$SYSROOTDIR --enable-languages=c

                                                   --with-gnu-ld --with-gnu-as --disable-multilib --with-floate=soft --disable-sjlj-exceptions --disable-nls --enable-threads=posix

                                                   --disable-libmudflap --disable-libssp --enable-long-longx --with-shared --with-gmp=$INSTALLDIR --with-mpfr=$INSTALLDIR

$ make 

$ make install

================================================================

二:crosstool-NG

http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.3.2.tar.bz2

$ ./configure --prefix=~/ct

$ make install

$ ~/ct/bin/ct-ng  list-samples

$ ~/ct/bin/ct-ng  show-arm-unkown-linux-gnueabi

$ ~/ct/bin/ct-ng  menuconfig     (删除sstrip  关闭 fortran和java语言的编译前端)

$ ~/ct/bin/ct-ng  

编译完成后会在 ~/x-tools/ 下生成对应的文件?