现在的位置: 首页 > 综合 > 正文

arm_linux移植手记(一)——交叉工具链编译(上)

2014年02月22日 ⁄ 综合 ⁄ 共 4231字 ⁄ 字号 评论关闭

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

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

(1)准备工作
  源码包:

gmp-4.3.2.tar.gz              ftp://ftp.gnu.org/gnu/gmp
mpfr-3.0.1.tar.gz             ftp://ftp.gnu.org/gnu/mpfr
glibc-ports-2.11.tar.bz2      ftp://ftp.gnu.org/gnu/glibc
binutils-2.18.tar.bz2         ftp://ftp.gnu.org/gnu/binutils
gcc-4.4.5.tar.gz              ftp://ftp.gnu.org/gnu/gcc
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上不去,只好从这里下了。

安装一些必备的东西

  aptitude install build-essential automake bison flex texinfo gawk g\+\+  
  aptitude remove mawk 
  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                           安装目录
  设置环境变量

  export TARGET=arm-none-linux-gnueabi
  export PREFIX=/opt/arm_linux/tools
  export PATH=$PATH:$PREFIX/bin

  安装gmp、mpfr

gmp

  tar xvf gmp-4.3.2.tar.gz 在gmp安装目录下 
  ./configure --prefix=$PREFIX     
  make   
  make check     
  make install

  mpfr  

  ./configure --prefix=$PREFIX --enable-shared --with-gmp=$PREFIX       
  make      
  make check

(2)编译binutils
 解压源码包到build-binutils,建立编译文件夹

 makdir build
 ./configure --prefix=$PREFIX --target=$TARGET --disable-nls --disable-multilib --enable-shared
 make configure-host
 make           
 make install

(3)生成内核头文件
 在解压好的目录下
 配置

 make ARCH=arm COROSS_COMPILE=arm-linux- menuconfig
 make ARCH=arm COROSS_COMPILE=arm-linux- 

 ----不管错误,只是生成需要的头文件
 建立include及链接

 mkdir -p $PREFIX/include
 cd $PREFIX/include
 ln -s /opt/arm_linux/kernel/linux-2.6.32/arch/arm/include/asm asm
 ln -s /opt/arm_linux/kernel/linux-2.6.32/include/linux  linux
 ln -s /opt/arm_linux/kernel/linux-2.6.32/include/asm-generic asm-generic

(4)初编译gcc
 配置 
 ----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹

 mkdir build
 ../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
 make all-gcc all-target-libgcc
 make install-gcc install-target-libgcc

(5)编译c库
 配置
 ----不能在源码解压的目录下直接编译,可以在其目录下新建一个文件夹

mkdir build
cd build
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

编译

cd $PREFIX/lib/gcc/$TARGET/4.4.5 
ln -s libgcc.a libgcc_eh.a 
make       make PREFIX=/opt/arm_linux install

(6)第二次编译gcc
  修正

cd $PREFIX/arm-none-linux-gnueabi  
rm lib include -rf  
ln -s ../lib lib  
ln -s ../include include

  配置

../build-gcc/gcc-4.4.5/configure --prefix=$PREFIX --target=$TARGET --disable-nls --enable-shared --enable-languages=c,c++ --enable-c99 --enable-long-long --disable-multilib --enable-__cxa_atexit --with-gmp=$PREFIX --with-mpfr=$PREFIX
如果想能够编译u-boot等,针对2440的可以加上--with-arch=armv4t --with-cpu=arm920t --with-tune=arm920t  即可。然后make  makeinstall

7.测试  
  可以直接写个helloworld,用arm-none-linux-gnueabi-gcc编译一下,然后使用file命令查看其属性,我这里是把mini2440提供的内核解压,然后将makefile中的cross-compile的arm-linux-换成现在的arm-none-linux-gnueabi-,make zImage,找到内核下载到板子上,部分信息如下:

load Image of Linux...Uncompressing Linux................................................................................................................................................................. done, booting the kernel.
Linux version 2.6.32.2-FriendlyARM (root@debian6) (gcc version 4.4.5 (GCC) ) #2 Fri Sep 23 17:09:08 CST 2011
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM Mini2440 development board
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)

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

【参考】

1.交叉工具链制作至尊宝典  http://blog.csdn.net/turui/article/details/6596093
2.如何为嵌入式开发建立交叉编译环境  https://www.ibm.com/developerworks/cn/linux/l-embcmpl/
3.Cross-Compiled Linux From Scratch - Embedded   http://cross-lfs.org/view/clfs-embedded/arm/index.html
4.自己动手制作交叉编译工具链 http://hi.baidu.com/mynana/blog/item/479eb25183ec2210377abee0.html

抱歉!评论已关闭.