arm交叉编译工具链的制作

一个交叉编译工具链只有自己动手制作以后才会真的有所了解!

制作过程真的不是一撮儿就的,第一次制作可能需要花费些时间奥,耐心!错误将是难免!


主机环境

   ubuntu 12.04.1 64bit
   gcc version 4.6.3


下载源码包:

      binutils-2.22.tar.gz


   gcc-4.7.2.tar.bz2
   gmp-5.0.5.tar.xz
   mpfr-3.1.1.tar.xz
   mpc-1.0.1.tar.gz


   glibc-2.11.tar.xz
   glibc-linuxthreads-2.5.tar.bz2
   glibc-ports-2.11.tar.xz


以上从http://ftp.gnu.org/gnu都可以下载的到



   linux-2.6.33.tar.bz2

http://www.kernel.org/pub/linux/kernel/v2.6/

ftp://ftp.arm.linux.org.uk/


1. 配置编译环境

[html]  view plain copy
  1. cd ~/src  
  2. vim armenv  
  3. # 将以下内容写入armenv文件中保存退出  
  4. TARGET=arm-linux-gnueabi  
  5. PREFIX=/opt/cross/gcc-4.7.2/$TARGET  
  6. PATH=$PREFIX/bin:$PATH  
  7.   
  8. export TARGET PREFIX PATH  
  9.   
  10. # 配置编译环境  
  11. . armenv  

2. 编译binutils
[html]  view plain copy
  1. tar -xzf binutils-2.22.tar.gz  
  2. mkdir binutils-build  
  3. cd binutils-build  
  4. ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX  
  5. make -j2  
  6. sudo make install  
  7. cd ..  

3. 第一次编译gcc

[html]  view plain copy
  1. tar -xjf gcc-4.7.2.tar.bz2  
  2. mkdir gcc-bootstrap-build  
  3. tar -xf gmp-5.0.5.tar.xz  
  4. tar -xf mpfr-3.1.1.tar.xz  
  5. tar -xf mpc-1.0.1.tar.gz  
  6. cd gcc-4.7.2  
  7. mv -v gmp-5.0.5 gmp  
  8. mv -v mpfr-3.1.1 mpfr  
  9. mv -v mpc-1.0.1 mpc  
  10. cd ../gcc-bootstrap-build  
  11.   
  12. ../gcc-4.7.2/configure \  
  13.   --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu \  
  14.   --enable-targets=all --prefix=$PREFIX --enable-obsolete \  
  15.   --enable-languages=c --with-newlib --without-headers --disable-nls \  
  16.   --disable-threads --disable-shared --disable-libmudflap --disable-libssp \  
  17.   --disable-libgomp --disable-decimal-float --enable-checking=release \  
  18.   --disable-bootstrap --disable-libquadmath \  
  19.   --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \  
  20.   --with-mpfr-lib=$(pwd)/mpfr/src/.libs  
  21. make -j2 all-gcc   
  22. make -j2 all-target-libgcc  
  23. sudo make install-gcc  
  24. sudo make install-target-gcc  
  25. sudo cp -v libiberty/libiberty.a $PREFIX/lib  
  26. # 以下添加libgcc_eh.a,libgcc_s.a到libgcc.a的软链接,防止编译C库时出错  
  27. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`  
  28. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_s/'`  
  29. cd ..  

4. 安装内核头文件
[html]  view plain copy
  1. tar -xjf linux-3.5.4.tar.bz2  
  2. cd linux-3.5.4  
  3. make ARCH=arm headers_check  
  4. make ARCH=arm INSTALL_HDR_PATH=dest headers_install  
  5. sudo cp -rv dest/include/* $PREFIX/$TARGET/include  
  6. 注意:内核头文件的安装位置是$PREFIX/$TARGET/include,而不是$PREFIX  
  7. cd ..  

5. 编译C库
[html]  view plain copy
  1. tar -xf glibc-2.11.tar.xz  
  2. tar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.11 
  3. tar -xf glibc-ports-2.11.tar.xz  
  4. mv glibc-ports-2.11 glibc-2.11/ports  
  5. mkdir glibc-build  
  6. cd glibc-build  
  7.   
  8. CC=$TARGET-gcc \  
  9. AR=$TARGET-ar \  
  10. RANLIB=$TARGET-ranlib \  
  11. ../glibc-2.11/configure \  
  12.   --host=$TARGET \  
  13.   --prefix=$PREFIX/$TARGET \  
  14.   --with-tls --disable-profile \  
  15.   --enable-add-ons --with-headers=$PREFIX/$TARGET/include \  
  16.   libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes  
  17. 注意:C库的安装位置是$PREFIX/$TARGET,编译完整的gcc时链接使用  
  18. sudo make -j2  
  19. sudo -s  
  20. . ../armenv  
  21. make install  
  22. exit  
  23. cd ..  

6. 编译完整的gcc
[html]  view plain copy
  1. tar -xf gmp-5.0.5.tar.xz  
  2. cd gmp-5.0.5  
  3. ./configure --prefix=/usr  
  4. make -j2  
  5. sudo make install  
  6. cd ..  
  7.   
  8. tar -xf mpfr-3.1.1.tar.xz  
  9. cd mpfr-3.1.1  
  10. ./configure --prefix=/usr  
  11. make -j2  
  12. sudo make install  
  13. cd ..  
  14.   
  15. tar -xf mpc-1.0.1.tar.gz  
  16. cd mpc-1.0.1  
  17. ./configure --prefix=/usr  
  18. make -j2  
  19. sudo make install  
  20. cd ..  
  21. # 若系统中安装gmp,mpfr,mpc且版本满足要求,可不用编译安装。  
  22. # 构建期间,将三者安装到其他位置,并添加了链接搜索路径,试了几次都没有成功。  
  23. # 有时间再做尝试,估计是哪里配置不正确。  
  24.   
  25. ../gcc-4.7.2/configure --target=$TARGET \  
  26.   --host=x86_64-linux-gnu --build=x86_64-linux-gnu \  
  27.   --prefix=$PREFIX \  
  28.   --enable-languages=c,c++ --enable-shared  --enable-obsolete 
  29. make -j2  
  30. sudo make install  
  31. cd ..  

7. 测试
(1) 动态编译
[html]  view plain copy
  1. arm-linux-gnueabi-gcc -o hello hello.c  
  2. arm-linux-gnu-eabi-strip hello  
  3. file hello  
  4. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped  
(2) 静态编译
[html]  view plain copy
  1. arm-linux-gnueabi-gcc -o hello hello.c -static  
  2. arm-linux-gnu-eabi-strip hello  
  3. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped  
实际还未放入开发板中进行测试,待开发板环境搭好,测试过再做更新。

另外请参考另外一篇文章:使用crosstool-ng制作交叉编译工具

你可能感兴趣的:(交叉编译)