Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137277
  • 博文数量: 35
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-09 12:22
个人简介

http://www.76ku.cn

文章分类

全部博文(35)

文章存档

2011年(1)

2010年(17)

2007年(17)

我的朋友

分类: LINUX

2007-06-10 02:03:01

Building a GNU/Linux ARM Toolchain (from scratch)
建设 GNU/Linux arm 交叉编译工具(从零开始)

一 下载源文件( 或其它网站)

  1.
  2.
  3.
  4.
  5.~coldwell/toolchain/ioperm.c.diff
  6.
  7.
  8.~coldwell/toolchain/t-linux.diff  9.


  设置环境变量及工作目录
     
环境变量
  TARGET=arm-unknown-linux-gnu 
生成的  arm-linux 工具的安装目录
  PREFIX=/usr/arm      
顶级目录
  SYSROOT=${PREFIX}/sysroot
  export ARCH=arm       cpu
系列(arm类)
  export CROSS_COMPILE=${TARGET}-
  export PATH=$PATH:${PREFIX}/bin  
命令路径

     
源文件目录
  mkdir -p $PREFIX/src

  创建二进制工具
  binutils
是一些二进制工具的集合,其中包含了我们常用到的asld
  cd ${PREFIX}/src
  tar xvfz binutils-2.16.tar.gz
  mkdir -p BUILD/binutils-2.16
  cd BUILD/binutils-2.16
  ../../binutils-2.16/configure --prefix=${PREFIX} --target=${TARGET} --with-sysroot=${SYSROOT} && make && make install && echo ok (
如果最后一行显示 ok 则表示安装成功)

  建立内核头文件

    
在这一步,内核头被安装在sysroot目录. 为处理器AT91RM9200配置内核,安装补丁。
  cd ${PREFIX}/src
  tar zxvf linux-2.6.10.tar.gz
  ln -s linux-2.6.10 linux
  zcat 2.6.10-at91.patch.gz | patch -d linux -p1
  cd linux
  make at91rm9200dk_defconfig
  make include/linux/version.h
  mkdir -p ${SYSROOT}/usr/include
  cp -a ${PREFIX}/src/linux/include/linux ${SYSROOT}/usr/include/linux
  cp -a ${PREFIX}/src/linux/include/asm-arm ${SYSROOT}/usr/include/asm
  cp -a ${PREFIX}/src/linux/include/asm-generic ${SYSROOT}/usr/include/asm-generic

  安装glibc头文件
  cd ${PREFIX}/src
  tar zxvf glibc-2.3.5.tar.gz
  patch -d glibc-2.3.5 -p1   cd glibc-2.3.5
  tar xvfz ../glibc-linuxthreads-2.3.5.tar.gz
  cd ..
  mkdir -p BUILD/glibc-2.3.5-headers
  cd BUILD/glibc-2.3.5-headers
  ../../glibc-2.3.5/configure --prefix=/usr --host=${TARGET} --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include && make cross-compiling=yes install_root=${SYSROOT}
  install-headers && echo ok
  touch ${SYSROOT}/usr/include/gnu/stubs.h
  touch ${SYSROOT}/usr/include/bits/stdio_lim.h

  第一阶段编译器GCC
   
2个补丁,用于生成所需的C运行时文件crti.o,crtn.o,及修正错误(避免内部编译器错误)。

  cd ${PREFIX}/src
  tar jxvf gcc-3.4.4.tar.bz2
  patch -d gcc-3.4.4 -p1 < flow.c.diff
  patch -d gcc-3.4.4 -p1 < t-linux.diff
  mkdir -p BUILD/gcc-3.4.4-stage1
  cd BUILD/gcc-3.4.4-stage1
  ../../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c --with-sysroot=${SYSROOT} && make && make install && echo ok

七 建立GNU C
  cd ${PREFIX}/src
  mkdir -p BUILD/glibc-2.3.5
  cd BUILD/glibc-2.3.5
  BUILD_CC=gcc CC=${CROSS_COMPILE}gcc AR=${CROSS_COMPILE}ar RANLIB=${CROSS_COMPILE}ranlib AS=${CROSS_COMPILE}as LD=${CROSS_COMPILE}ld ../../glibc-2.3.5/configure --prefix=/usr --build=i386-redhat-linux --host=arm-unknown-linux-gnu --target=arm-unknown-linux-gnu --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include && make && make install_root=${SYSROOT} install && echo ok

 
   第二阶段重建GCC
   
利用建好的GNU C库重建编译器
GCC
  cd ${PREFIX}/src
  mkdir -p BUILD/gcc-3.4.4
  cd BUILD/gcc-3.4.4
  ../../gcc-3.4.4/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c,c++ --with-sysroot=${SYSROOT} && make && make install && echo ok

    测试

  1)
编写一个 HelloWorld 程序,然后 arm-unknown-linux-gnu-gcc helloworld.c -o helloworld
  2)file helloworld
aa: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.0.0, dynamically linked (usesshared libs), not stripped
如果显示出上面的输出,说明你编译了一个能在 arm 体系结构下运行的 helloworld,证明你的编译工具做成功了。



(the end)

Resources

    * GNU Binutils
    * GNU Compiler Collection (GCC)
    * GNU C Library (glibc)
    * Linux kernel sources
    * ARM Linux
    * Atmel AT91RM9200 patches for Linux 2.6
    * Atmel AT91 processors
    * Software floating point in GCC wiki/Software%20floating%20point
 

阅读(983) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~