生成Linux2.6/2.4交叉编译工具链


      软件包准备(请到ftp.gnu.org下载)
      binutils-2.15.tar.gz
      gcc-core-3.4.2.tar.bz2
      gcc-g++3.4.2.tar.bz2
      glibc-2.3.5.tar.gz
      glibc-linuxthreads-2.3.5.tar.bz2
      linux-2.6.9.tar.gz

      我们的工作路径是(用root用户登录):
      ~/tars/SourceDir
      ~/tars/BuildDir
      /armtools
      # cd ~
      # mkdir –p tars/SourceDir
      # mkdir tars/BuildDir
      # mkdir /armtools

      tars --------------- 在这里放我们的下载来的所有源文件
      SourceDir ------ 这个临时目录放我们解压缩后的源文件
      BuildDir --------- 我们在这里编译
      armtools -------- 把arm-linux 交叉编译环境的安装在这里

      1.编译binutils
      # cd ~/tars/SourceDir
      # tar -zxf ../binutils-2.15.tar.gz
      # cd ~/tars/BuildDir
      # mkdir binutils
      # cd binutils
      # ../../SourceDir/binutils-2.15/configure --target=arm-linux /
      --prefix=/armtools
      # make ; make install
      # export PATH=/armtools/bin:$PATH

      (安装成功。)

      2.解压缩,配置,拷贝头文件
      # cd ~/tars/SourceDir
      # tar -zxf ../linux-2.6.9.tar.gz
      # cd linux-2.6.9
      # vi Makefile
      把里面的SUBARCH那行 注释掉
      # SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ /
      -e s/arm.*/arm/ -e s/sa110/arm/ /
      -e s/s390x/s390/ -e s/parisc64/parisc/ )

      然后新加一行SUBARCH := arm
      # CROSS_COMPILE ?=(注释掉)
      然后新加一行CROSS_COMPILE = arm-linux
      # make menuconfig 选中s3c2410

      # make include/linux/version.h就创建了一个在源码目录下include/linux/version.h的文件
      # mkdir -p /armtools/arm-linux/include
      # cp -dR include/asm-arm /armtools/arm-linux/include/asm
      # cp -dR include/linux /armtools/arm-linux/include/linux

      (完成)

      3.编译gcc-3.4.2
      # cd ~/tars/SourceDir
      # tar -jxf ../gcc-core-3.4.2.tar.bz2

      给gcc打一个补丁,在目录gcc-3.4.2/gcc/下编辑一个文件flow.c.diff,内容如下
      ===================================================================
      RCS file: /cvs/gcc/gcc/gcc/flow.c,v
      retrieving revision 1.593
      retrieving revision 1.594
      diff -u -r1.593 -r1.594
      --- gcc/gcc/flow.c 2004/07/09 03:29:32 1.593
      +++ gcc/gcc/flow.c 2004/08/02 13:19:39 1.594
      @@ -1865,19 +1865,22 @@
      rtx set_src = SET_SRC (pc_set (BB_END (bb)));
      rtx cond_true = XEXP (set_src, 0);
      rtx reg = XEXP (cond_true, 0);
      + enum rtx_code inv_cond;

      if (GET_CODE (reg) == SUBREG)
      reg = SUBREG_REG (reg);

      /* We can only track conditional lifetimes if the condition is
      - in the form of a comparison of a register against zero.
      - If the condition is more complex than that, then it is safe
      - not to record any information. */
      - if (REG_P (reg)
      + in the form of a reversible comparison of a register against
      + zero. If the condition is more complex than that, then it is
      + safe not to record any information. */
      + inv_cond = reversed_comparison_code (cond_true, BB_END (bb));
      + if (inv_cond != UNKNOWN
      + && REG_P (reg)
      && XEXP (cond_true, 1) == const0_rtx)
      {
      rtx cond_false
      - = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)),
      + = gen_rtx_fmt_ee (inv_cond,
      GET_MODE (cond_true), XEXP (cond_true, 0),
      XEXP (cond_true, 1));
      if (GET_CODE (XEXP (set_src, 1)) == PC)
      ===================================================================
      用此文件给flow.c打补丁,或者依此文件直接修改flow.c(修改前请备份这两个文件)


      # cd ~/tars/BuildDir
      # mkdir gcc-core
      # cd gcc-core
      # ../../SourceDir/gcc-3.4.2/configure --target=arm-linux
      --prefix=/armtools --enable-

      languages=c --disable-shared --disable-threads --without-headers
      --with-newlib
      # make ; make install

      4.编译安装glibc

      # cd ~/tars/SourceDir
      # tar -zxf ../glibc-2.3.5.tar.gz
      # cd glibc-2.3.5
      # tar -jxf ../../glibc-linuxthreads-2.3.5.tar.gz

      # cd ~/tars/BuildDir
      # mkdir glibc
      # cd glibc
      # export CC=arm-linux-gcc
      # cp -dR ~/tars/SourceDir/linux-2.6.9/include/asm-generic
      /armtools/arm-linux/include/

      # vi ~/tars/SourceDir/glibc-2.3.5/sysdeps/unix/sysv/linux/arm/ioperm.c
      将里面的BUS_ISA改为CTL_BUS_ISA

      # vi ~/tars/SourceDir/glibc-2.3.5/Makeconfig,把里面的-lgcc_eh都删掉

      # ~/tars/SourceDir/glibc-2.3.5/configure --prefix=/armtools/arm-linux /
      --host=arm-linux /
      --build=i686-pc-linux-gnu /
      --with-headers=/armtools/arm-linux/include /
      --enable-add-ons=linuxthreads


      # make ;make install (这步花了很长时间)


      5.编译安装gcc 的c, c++ 编译器。
      # cd ~/tars/SourceDir/
      # tar -jxf ../gcc-g++-3.4.2.tar.bz2
      # cd ~/tars/BuildDir/
      # mkdir gcc
      # cd gcc
      # unset CC

      # ../../SourceDir/gcc-3.4.2/configure --prefix=/usr/arm_tools/
      --target=arm-linux /
      --enable-languages=c,c++ /
      --without-headers /
      --disable-shared
      # make ;make install


      编辑一个helloworld.c 编译一下,没有问题吧?哈哈
      OK,Congratulations!

      最后打包压缩一下
      # cd ~
      # tar -cf armtools.tar /armtools (大小198021120)
      # bzip2 -z armtools.tar (大小51055772)


       *****************************************************************
      Linux kerel 2.4
      本部分由同济大学软件学院沈猛整理,转载请注明出处。
      (本文根据网上资料修改而成,确保每步都可以正确执行。)

      在Host机上建立arm-linux-gcc交叉编译环境:
      我们采用的源代码版本和下载路径如下:
      binutils-2.14.tar.gz
      ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.gz
      gcc-core-2.95.3.tar.gz
      ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-core-2.95.3.tar.gz
      gcc-g++2.95.3.tar.gz
      ftp://ftp.gnu.org/gnu/gcc/gcc-2.95.3/gcc-g++-2.95.3.tar.gz
      glibc-2.2.4.tar.gz
      ftp://ftp.gnu.org/gnu/glibc/glibc-2.2.4.tar.gz
      glibc-linuxthreads-2.2.4.tar.gz
      ftp://ftp.gnu.org/gnu/glibc/glibc-linuxthreads-2.2.4.tar.gz
      linux-2.4.21.tar.gz
      ftp://ftp.kernle.org/pub/....../v2.4/linux-2.4.21.tar.gz
      patch-2.4.21-rmk1.gz
      ftp://ftp.arm.linux.org.u......v2.4/patch-2.4.21-rmk1.gz

      我们在bash 下工作,先设定一些变量:
      # export VBINUTILS=2.14
      # export VGCC=2.95.3
      # export VGLIBC=2.2.4
      # export VLINUX=2.4.21
      # export VLINUX_PATCH=rmk1
      # export PREFIX=/armtools
      # export TARGET=arm-linux

      我们的工作路径是(用root用户登录):
      ~/tars/SourceDir
      ~/tars/BuildDir
      /armtools

      # cd ~
      # mkdir –p tars/SourceDir
      # mkdir tars/BuildDir
      # mkdir /armtools
      tars --------------- 在这里放我们的下载来的.tar.gz 文件
      SourceDir ------ 这个临时目录放我们解压缩后的源文件
      BuildDir --------- 我们在这里编译
      armtools -------- 把arm-linux 交叉编译环境的安装在这里


      1. 1安装linux 的头文件当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc
时都需要一套不同的linux头文件。
      (1) 解压缩,打补丁
      # cd ~/tars/SourceDir
      # tar -zxf ../linux-$VLINUX.tar.gz
      # mv linux-2.4.21 linux
      # cd linux
      # zcat ../../patch-$VLINUX-$VLINUX_PATCH.gz | patch -p1

      (2) 清理一下$ make mrproper

      (3) 修改Makefile 将Makefile中ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e
      s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
      这一行注释掉,并加一行ARCH=arm。修改后象这样:
      ARCH=arm
      # ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e
      s/arm.*/arm/ -e s/sa110/arm/)
      然后运行
      # make menuconfig 进行适当配置
      此版本内核中,在System type 里面根据板子设置( )ARM system type

      (4) 建立连接
      # cd ~/tars/SourceDir/linux/include/asm
      如果里面没有proc 和 arch两个链接文件的话,运行下面两个命令。如果有,就跳过下两个命令。
      # ln –s proc-armv proc
      # ln –s arch-*(*代表板子名称) arch

      (5) 拷贝头文件
      # mkdir -p $PREFIX/$TARGET/include
      # cd ~/tars/SourceDir/linux/
      # cp -dR include/linux $PREFIX/$TARGET/include
      # cp -dR include/asm-arm $PREFIX/$TARGET/include/asm

      (6) 为gcc 建立一个linux kernel 头文件的连接。
      # cd $PREFIX/$TARGET
      # ln -s include sys-include

      1.2 编译安装binutils 这里用不到前面准备的linux 头文件
      # cd ~/tars/SourceDir
      # tar -zxf ../binutils-$VBINUTILS.tar.gz
      # cd ~/tars/BuildDir
      # mkdir binutils
      # cd binutils
      #../../SourceDir/binutils-$VBINUTILS/configure --target=$TARGET
      --prefix=$PREFIX
      # make all install
      (3) export PATH=$PREFIX/bin:$PATH

      1.3 编译安装gcc 的c 编译器
      (1) 解压缩
      # cd ~/tars/SourceDir
      # tar -zxf ../gcc-core-$VGCC.tar.gz

      (2) 修改gcc 的t-linux 文件
      # cd gcc-$VGCC/gcc/config/arm
      # mv t-linux t-linux-orig
      # sed 's/TARGET_LIBGCC2_CFLAGS = /TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h
      -Dinhibit_libc/' < t-linux-orig > t-linux-core
      # cp ./t-linux-core ./t-linux

      (3) 编译
      # cd ~/tars/BuildDir
      #mkdir gcc-core
      # cd gcc-core
      # ../../SourceDir/gcc-$VGCC/configure --target=$TARGET --prefix=$PREFIX
      --enable-languages=c --disable-shared --disable-threads
      # make all install

      1.4 编译安装glibc
      (1) 解压缩
      # cd ~/tars/SourceDir
      # tar -zxf ../glibc-$VGLIBC.tar.gz
      # cd glibc-$VGLIBC
      # tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz

      (2) 编译
      # cd ~/tars/BuildDir
      # mkdir glibc
      # cd glibc
      # CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib /
      ../../SourceDir/glibc-$VGLIBC/configure /
      --host=$TARGET --prefix=$PREFIX/$TARGET --enable-add-ons
      # make all install (这步花了很长时间)

      1.5.编译安装gcc 的c, c++ 编译器
      (1) 恢复t-linux 文件
      # cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/
      # cp t-linux-orig t-linux

      (2) 解压缩c++ 编译器
      # cd ~/tars/SourceDir/
      # tar -zxf ../gcc-g++-$VGCC.tar.gz
      # cd ~/tars/BuildDir
      # mkdir gcc
      # cd gcc

      (3) 编译
      # ../../SourceDir/gcc-$VGCC/configure --target=$TARGET --prefix=$PREFIX
      --enable-languages=c,c++ --with-included-gettext
      # make all install

      注:如果你下载的是filename.tar.bz2,你可以用如下命令之一解压缩,第三种方式在任何系统中都好使。
      第一种方式: # tar -jxf filename.tar.bz2
      第二种方式: # tar -Ixf filename.tar.bz2
      第三种方式: # bzip2 -dc filename.tar.bz2 | tar xf –
      如果你是第一次制作arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版本,按照本文的方法可能会在编译的时候出问题。

 

      生成的toolchain 大于150 兆,用如下方法压缩:
      # cd ~
      # tar -cf armtools.tar /armtools (大小157399040)
      # bzip2 -z armtools.tar (大小32688701)
      压缩后生成的armtools.tar.bz2 大概有30 几兆。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值