利用Crosstool-ng 1.3.3 生成powerpc交叉编译工具链

ARM 87浏览

 

 

有人问起建立交叉编译环境,以前用过ELDK或者crosstool来生成PowerPC405的交叉编译工具链。以前也写过类似的Blog(见参考4),做起来不是很麻烦,但是crosstool做生成的gcc以及相关的库版本太低,无法支持最新的内核。最近发现一个很好用的工具,crosstool-ng(见参考1),用于生成交叉编译工具链,那是相当不错的选择,支持的架构有:PowerPC,ARM,MIPS,X86-64等,最关键的是它生成的工具链支持最新的内核,同时还在更新中。

这里记录一下我个人生成交叉编译工具链的过程,中间有点曲折,发现错误,但是不知道怎么解决。

 主要步骤

crosstool-ng-1.3.3 下载地址是:

http://ymorin.is-a-geek.org/projects/crosstool

  主要步骤如下:

   1: #tar–xvf crosstool-ng-1.3.3.tar.bz2
   2: #cd crosstool-ng-1.3.3
   3: #./configure --local
   4: #make
   5: #make install
   6: #./ct-ng–menuconfig

这个时候就有点像配置内核一样,操作完全一样,这就是它方便的地方。 这个主要见下文主要的配置。

   1: #unset LD_LIBRARY_PATH LIBRARY_PATH CPATH
   2: #export LD_LIBRARY_PATH LIBRARY_PATH CPATH
   3: #./ct-ng build 

一切顺利的话,会在Prefix directoy(在配置中会涉及到这个选项)的目录下生成powerpc-405-linux-gnu,在bin目录下面可以看到如下图的工具链命令。

image

主要的配置(基于Glibc)

    这个配置本人已经通过编译,如果编译时出错请尝试更换glibc,gcc,binutils的版本。

  • Paths and misc options
    • Paths
      • Local tarballs directory: ${HOME}/tarballs
      • Save new tarballs: Yes
      • Prefix directory: /home/yao/crosstool-ng-1.3.3/${CT_TARGET}
    • Build behavior
      • Number of parallel jobs: 3 or 4 (if you have a quad-core computer)
      • Nice level: 10
    • Logging
      • Maximum log level to see: EXTRA
  • Target options
    • Target Architecture: powerpc
    • Emit assembly for CPU: 405
    • Tune assembly for CPU: 405
    • Floating point: software
  • Toolchain options
    • Vendor string: 405
    • Use sysroot’ed toolchain
    • Build shared libraries
  • Operating System
    • Target OS: linux
    • Linux kernel version: 2.6.27.6
  • GMP and MPFR
    • Build libraries for target: Yes
    • GMP version: 4.2.4
    • MPFR version: 2.3.2
  • binutils
    • binutils version: 2.19
    • binutils libraries for the target: Yes (libiberty and libbfd)
  • C compiler
    • gcc version: 4.3.2
    • C++: Yes
    • Fortran: Yes (optional)
    • Java: Yes (optional)
    • (Untested: enable any other languages you may want)
  • C-library
    • C library: glibc
    • glibc version: 2.7
    • Threading implementation to use: nptl
    • Use the ports addon: Yes
  • Tools (Optional, Untested!)
    • libelf: Yes
    • sstrip: No (because I couldn't get it to build)
  • Debug facilities (Optional, Untested!)
    • dmalloc: Yes (5.5.2)
    • duma: Yes (2_5_14)
    • gdb: Yes
      • Build a static cross gdb: Yes
      • Native gdb: Yes
      • Build a static native gdb: Yes
      • Use GMP and MPFR: yes
      • Version: 6.8
    • ltrace: Yes (0.4)
    • strace: No (because I couldn't get it to build

需要下载的包

根据上面的配置文件,需要如下的包,如果不手动下载到Local tarballs directory,ct-ng会自动下载,但是会很慢,建议还是手动下载如下的包至Local tarballs directory。

binutils-2.19.tar.bz2 

duma-2_5_14.tar.gz  

glibc-2.7.tar.bz2        

libelf-0.8.10.tar.gz  

ltrace-0.4.tar.gz

dmalloc-5.5.2.tgz      

gcc-4.3.2.tar.bz2   

glibc-ports-2.7.tar.bz2  

linux-2.6.27.6.tar.bz2  

mpfr-2.3.2.tar.bz2     

gdb-6.8.tar.bz2     

gmp-4.2.4.tar.bz2        

ltrace_0.4.orig.tar.gz  

ncurses-5.6.tar.gz

出现的错误记录

 

[ALL  ]    tar: Error exit delayed from previous errors

[ERROR]    Build failed in step 'Extracting and patching toolchain components'

[ERROR]    Error happened in '/home/yao/crosstool-ng-1.3.2/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry)

[ERROR]          called from '/home/yao/crosstool-ng-1.3.2/scripts/functions' at line # 564 in function 'CT_ExtractAndPatch'

[ERROR]          called from '/home/yao/crosstool-ng-1.3.2/scripts/build/binutils.sh' at line # 18 in function 'do_binutils_extract'

[ERROR]          called from '/home/yao/crosstool-ng-1.3.2/scripts/crosstool.sh' at line # 433 in function 'main'

[ERROR]    Look at '/home/yao/powerpc-405-linux-gnu/build.log' for more info on this error.

crosstool-ng的配置文件(.config)用的是参考2所提供的,只是修改了工作目录和预安装目录的路径。有人说是版本之间的冲突才导致编译错误(参考3),所以我尝试了更换了Glibc的版本,编译通过,生成相应的工具链。

Ref.

  1. Crosstool-ng官网
  2. Crosstool-ng 1.3.2
  3. Crosstool-NG是个好东西

  4. Linux2.4.26内核在Virtex II Pro开发板上的移植---建立交叉编译环境(三)