arm_linux移植手记:交叉工具链编译


    一直做的是应用项目,不知道怎么的,突然想把整个arm-linux移植流程跑一遍,如今就有了这一记录,希望对初学和有兴趣了解的人做些参考,同时还望行家们手下留情我,并多多指教。闲话少说,进入正题:第一步交叉工具链的制作。

    先说明我这里仅是对binutils、gcc、glibc的交叉编译,缺少gdb等以及对整个制作完成的打包整理,可能有些混乱。编译环境是Debian 6.0,使用的头文件内核linux2.6.32,编译是带EABI的,在交叉工具链编译(上)中主要将制作过程一介绍,在下中将说明原因、遇到的些错误及解决方法。

(1)准备工作
  源码包:
 
  1. gmp-4.3.2.tar.gz              ftp://ftp.gnu.org/gnu/gmp  
  2. mpfr-3.0.1.tar.gz             ftp://ftp.gnu.org/gnu/mpfr  
  3. glibc-ports-2.11.tar.bz2      ftp://ftp.gnu.org/gnu/glibc  
  4. binutils-2.18.tar.bz2         ftp://ftp.gnu.org/gnu/binutils  
  5. gcc-4.4.5.tar.gz              ftp://ftp.gnu.org/gnu/gcc  
  6. glibc-2.11.1.tar.bz2          ftp://ftp.gnu.org/gnu/gcc  

linux-2.6.32.tar.bz2          http://download.chinaunix.net/download.php?id=31468&ResourceID=6156

----最近kernel.org上不去,只好从这里下了。

安装一些必备的东西

  1. aptitude install build-essential automake bison flex texinfo gawk g\+\+    
  2. aptitude remove mawk   
  3. apt-get install libncurses*  
  目录
  build-tools                 存放源码及编译文件夹
    --build-binutils        binutils
    --build-gcc               gcc
    --build-glibc             glibc
    --build-required      gmp、mpfr、glibc-ports
    --build-gcc-final      最后的gcc 

  kernel                      linux内核源码,包括下载的没有修改过的和

                                   测试使用的是mini2440提供的内核linux2.6.32.2

  tools                           安装目录
  设置环境变量  
  1. export TARGET=arm-none-linux-gnueabi  
  2. export PREFIX=/opt/arm_linux/tools  
  3. export PATH=$PATH:$PREFIX/bin  

  安装gmp、mpfr

gmp

 
  1. tar xvf gmp-4.3.2.tar.gz 在gmp安装目录下   
  2. ./configure --prefix=$PREFIX       
  3. make     
  4. make check       
  5. make install  
  mpfr  
 
  1. ./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX         
  2. make        
  3. make check  
(2)编译binutils
 解压源码包到build-binutils,建立编译文件夹
  1. makdir build  
  2. ./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared  
  3. make configure-host  
  4. make             
  5. make install  
(3)生成内核头文件
 在解压好的目录下
 配置
  1. make ARCH=arm COROSS_COMPILE=arm-linux- menuconfig  
  2. make ARCH=arm COROSS_COMPILE=arm-linux-   
 ----不管错误,只是生成需要的头文件
 建立include及链接
  1. mkdir -p $PREFIX/include  
  2. cd $PREFIX/include  
  3. ln -s /opt/arm_linux/kernel/linux-2.6.32/arch/arm/include/asm asm  
  4. ln -s /opt/arm_linux/kernel/linux-2.6.32/include/linux  linux  
  5. ln -s /opt/arm_linux/kernel/linux-2.6.32/include/asm-generic asm-generic  
(4)初编译gcc
 配置 
 ----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
  1. mkdir build  
  2. ../configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-shared --with-mpfr=$PREFIX --with-gmp=$PREFIX --without-headers --with-newlib --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --enable-languages=c --disable-multilib --with-abi=aapcs  
  3. make all-gcc all-target-libgcc  
  4. make install-gcc install-target-libgcc  
(5)编译c库
 配置
 ----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹
  1. mkdir build  
  2. cd build  
  3. CC=$TARGET-gcc ../configure --host=$TARGET --prefix=$PREFIX --enable-add-ons --with-binutils=$PREFIX/bin --with-headers=$PREFIX/include   libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes  
编译
  1. cd $PREFIX/lib/gcc/$TARGET/4.4.5   
  2. ln -s libgcc.a libgcc_eh.a   
  3. make       make PREFIX=/opt/arm_linux install  
(6)第二次编译gcc
  修正
  1. cd $PREFIX/arm-none-linux-gnueabi    
  2. rm lib include -rf    
  3. ln -s ../lib lib    
  4. ln -s ../include include  

  配置

  1. cd $PREFIX/arm-none-linux-gnueabi    
  2. rm lib include -rf    
  3. ln -s ../lib lib    
  4. ln -s ../include include  
7.测试  
  可以直接写个helloworld,用arm-none-linux-gnueabi-gcc编译一下,然后使用file命令查看其属性,我这里是把mini2440提供的内核解压,然后将makefile中的cross-compile的arm-linux-换成现在的arm-none-linux-gnueabi-,make zImage,找到内核下载到板子上,部分信息如下:
  1. load Image of Linux...Uncompressing Linux................................................................................................................................................................. done, booting the kernel.  
  2. Linux version 2.6.32.2-FriendlyARM (root@debian6) (gcc version 4.4.5 (GCC) ) #2 Fri Sep 23 17:09:08 CST 2011  
  3. CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177  
  4. CPU: VIVT data cache, VIVT instruction cache  
  5. Machine: FriendlyARM Mini2440 development board  
  6. ATAG_INITRD is deprecated; please update your bootloader.  
  7. Memory policy: ECC disabled, Data cache writeback  
  8. CPU S3C2440A (id 0x32440001)  

好了,只要按着做,应该就有自己的编译器了,不过很多配置我现在也不太清楚,主要就是参考下面的文章,以及碰到错误搜索下了。别急,下一页()会简单看下碰到什么问题以及怎样解决的。

参考:

交叉工具链制作至尊宝典

如何为嵌入式开发建立交叉编译环境

自己动手制作交叉编译工具链

 

  • 1
  • 2
  • 下一页

相关内容