第 1 章 Crosstool-ng制作交叉编译工具链

作者:宋老师,华清远见教育科技集团讲师。

1.1 源码下载

crosstools-ng 下载地址
        //ymorin.is-a-geek.org/download/crosstool-ng/
        同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是
        //crosstool-ng.org/download/crosstool-ng/01-fixes/
        这里我们用crosstool-ng-1.20.0.tar(没有补丁)

( a ) 安装工具

        $ sudo apt-get install gawk autotools-devautomaketexinfolibtoolcvs patch bison flex
        libncurses5-devlibexpat1-devcvsdgcj g++ ncurses curl
        svntexinfolzmareadlinkwebsvndpkg-devsedm4texinfolibtool-y

( b ) 创建安装目录

$ mkdircrosstool-ng //crosstool-ng的安装目录
        $ mkdircrosstool-ng_build //crosstool-ng编译路径

( c ) 如果有补丁则对源码打补丁

$ tar xvf crosstool-ng-1.20.0.tar.bz2
        $ cd crosstool-ng-1.20.0

如果补丁则打补丁,方法如下:
        $ patch –p1<补丁>

( d ) 配置并编译crosstool-ng-1.20.0

$ sudo ./configure --prefix=/home/songl/arm-linux-gcc/crosstool-ng
        $ make
        $ make install


注意:这的路径一定是绝对路径/home/songl/arm-linux-gcc/crosstool-ng(之前我使用相对路径出错)

( e ) 配置工具链选项

$cdcrosstool-ng_build
        $ cp ../crosstool-ng-1.20.0/samples/arm-unknown-linux-gnueabi/* .
        $ cpcrosstool.config .config
        $ ../crosstool-ng/bin/ct-ng menuconfig

弹出主菜单,如下图。此菜单主要用于交叉编译工具链的环境配置,请按照下图配置。

1.2 配置交叉编译工具

进入Paths and misc options -- →菜单,修改内容如下

提前下载好的源码包存放路径(按Enter键进入修改)

在编译过程中如果/Down目录下没有压缩包,将会自己下载压缩包,并保存到Down目录下。

Prefix directory编译完成后交叉编译工具生成路径

的网址下载到Local tarballs directory目录。

选择Debug crosstool-NG,会多出一个子菜单,选中Save intermediate steps,此选项提供一个从上一步错误的地方继续编译,而不是从新编译,这样节约大量的时间。

选择(3)Number of parallel jobs(NEW)

此项为增加编译时的并行进程数,以增加运行速度,加速编译。

进入target options -- →

ARMv4t 表示编译出的编译器支持ARMv4t架构的cpu;

ARM920t 为指定cpu的类型,S3C2440使用的CPU核心为ARM920t

通过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都ARM920T的核心,架构指令是armv4t,所以,如果要编译2410/2440的,就选armv4t。

以此类推S3C6410 ARM1176JZF-S核心使用的是armv6架构,就选armv6,那么具体都支持哪些架构呢?可以用man gcc来查询,搜索arm,再搜索-march=就可以找到本gcc支持的处理器核心列表了。

可以通过./arm-songlei-linux-gnueabi-gcc --target-help查看架构

进入Toolchain option-- →

Tuple's vendor string指定经销商的名称,影响向生成的编译器的前缀为arm-songlei-Linux-gnueabi;

Tuple's alias是生成编译器别名,可以使用arm-linux-gcc简洁的命令

进入Operating System --->选择编译的内核版本(选项没有的话,修改.config文件中的内核版本3.2.60改为3.2)

Binary utilities --->选择binutils的源码包版本号,配置二进制工具

C-library --->选择glibc库版本

如果:编译中需要支持unwind ,则选择[*] Force unwind support (READ HELP!); C compiler --->选择GCC版本

这里支持C和C++,如果希望生成的编译器支持Java,也可以在Java选单中支持。 注意:如果编译C++时出现找不到__cxa_atexit,需要选择。

Debug facilities --->选择调试工具版本

Companion libraries --->编译工具

GMP是实现任意精度算术运算的软件包,可以完成有符号整数、有理数和浮点数的运算。只要计算机的内存满足需求,GMP的运算精度没有任何限制。MPFR是一个用于高精度浮点运算的C库。

选中[*]check the companion libraries builds(!!! READ HELP!!!),检查companion libraries的版本信息。

接着保存退出

$ ../crosstool-ng/bin/ct-ng build

编译过程

编译完成

Missing: 'i686-pc-linux-gnu-gcj' or 'i686-pc-linux-gnu-gcj' or 'gcj' : either needed!用sudo apt-get install gcj安装,换了几个源,也还是不行,后来(编译Java时)

解决:sudo apt-get install gcj-jdk

Missing: 'i686-pc-linux-gnu-g++' or 'i686-pc-linuxG-gnu-g++' or 'g++' : either needed!

解决:sudo apt-get install g++

安装到cross-gdb时,出现configure: error: expat is missing or unusable,expat-2.1.0.tar.gz这个文件是运行build时它自己下载的

解决:sudo apt-get install libexpat1-dev

环境变量的添加
        修改文件/etc/bash.bashrc添加如下内容
        export PATH=$PATH:/home/songl/arm-linux-gcc/toolbuild/bin
        重启配置文件
        $ source /etc/bash.bashrc

1.3 小结:

Crosstool-ng可以编译OABI类型的编译器(老编译器标准),还可以编译EABI类型的新标准的嵌入式编译器。Crosstool-ng不仅支持ARM平台,还可以编译出其他平台的嵌入式编译器。

在编译交叉工具链的过程中,可以看一下编译的过程中打印出来的编译选项。对照D盘的Material下的“GCC-the-Complete-Reference.pdf”来学习编译器的参数和含义,这个很重要。因为基于Linux开发,会使用很多开源的代码,要用到很多复杂的配置脚本和Makefile文件。就要包括很多GCC的参数,了解了GCC的参数有助于帮助我们分析代码和调试错误。

下载以下软件包到之前建的src文件夹

binutils-2.19.1.tar.bz2 //ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2

dmalloc-5.5.2.tgz //dmalloc.com/releases/dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz //downloads.sourceforge.net/project/duma/duma/2.5.15/duma_2_5_15.tar.gz

expat-2.0.1.tar.gz ftp://ftp.nz.debian.org/gentoo/distfiles/expat-2.0.1.tar.gz

gcc-4.3.2.tar.bz2 //ftp.gnu.org/gnu/gcc/gcc-4.3.2/gcc-4.3.2.tar.bz2

gdb-6.8.tar.bz2 //ftp.gnu.org/gnu/gdb/gdb-6.8.tar.bz2

glibc-2.9.tar.gz //ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2

glibc-ports-2.9.tar.bz2 //ftp.gnu.org/gnu/glibc/glibc-ports-2.9.tar.bz2

gmp-4.3.2.tar.bz2 //ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2

libelf-0.8.13.tar.gz //www.mr511.de/software/libelf-0.8.13.tar.gz

linux-2.6.33.7.tar.bz2 //www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.7.tar.bz2

mpfr-2.4.2.tar.bz2 //ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.bz2

ncurses-5.7.tar.gz //ftp.gnu.org/gnu/ncurses/ncurses-5.7.tar.gz

strace-4.5.19.tar.bz2 //downloads.sourceforge.net/project/strace/strace/4.5.19/strace-4.5.19.tar.bz2

ltrace_0.5.3.orig.tar.gz //ftp.debian.org/debian/pool/main/l/ltrace/ltrace_0.5.3.orig.tar.gz

ecj-latest.jar //sources-redhat.mirrors.airband.net/java/ecj-latest.jar