Crosstool-ng制作交叉编译工具链:修订间差异
(未显示2个用户的25个中间版本) | |||
第1行: | 第1行: | ||
交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编译安装,后来由于这个太麻烦于是就有类似crosstool这样的自动化配置工具。 | |||
现在之所以用crosstool-ng是因为crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者。crosstool的gcc版本只能到4.1.1,无法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,现在最新能够建立 gcc 4.3.2版本,可用来编译最新内核。 | |||
;编译的系统环境是:ubuntu 10.10 + crosstool-ng 1.11.1 | |||
= 配置ubuntu编译环境 = | ;目标平台:ARMv4t, arm9tdmi,s3c2440 | ||
== 配置ubuntu编译环境 == | |||
安装编译所需的包 | 安装编译所需的包 | ||
bison | sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk -y | ||
安装结束以后就可以用了。 | |||
如果后面出现编译错误,再增加相应的包即可 | |||
== 安装crosstool-ng == | |||
;1. 首先从官方网站上下载crosstool-ng的源码包 http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.11.1.tar.bz2 | |||
;2. 将此源码包解压缩并编译安装 | |||
tar jxvf crosstool-ng-1.11.1.tar.bz2 | |||
cd crosstool-ng--1.11.1 | |||
./configure | |||
make | |||
sudo make install | |||
;3. 如果一切正常,则ct-ng命令就可以用了 | |||
注:编译的时候如果出现错误,可以利用apt-get的方式安装相应的包即可 | |||
== 配置自己的交叉编译器 == | |||
crosstool-ng可以配置各种平台的交叉编译器,也可以构建符合自己实用条件的个性编译器。下面以ARM平台为例,制作具有一定通用性的交叉编译器。这里我们从一个现成的编译器配置开始,用例子里的arm-unknown-linux-gnueabi作为配置的基础,然后来做一个交叉编译器。 | |||
;将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行 | |||
cp samples/arm-unknown-linux-gnueabi/crosstool.config .config | |||
;然后执行: | |||
ct-ng menuconfig | |||
;进入配置菜单,与linux内核很类似 | |||
:在这里,我对以下各选项稍作修改 | |||
Paths and misc options ---> | |||
...... | |||
(${HOME}/src) Local tarballs directory # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到~/src下。 | |||
...... | |||
(/opt/${CT_TARGET}) Prefix directory # 制作好的编译器所放置的目录 | |||
Target options ---> | |||
Target Architecture (arm) ---> # 注意看这项是不是ARM平台 | |||
...... | |||
Floating point: (software) ---> # 对于很多ARM架构CPU来说是不支持硬浮点运算的,所以选择软件方式有更好的兼容性 | |||
...... | |||
[*] Use EABI # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中 | |||
Toolchain options ---> | |||
..... | |||
(tonghuix) Tuple's vendor string # 这里可以修改成你自己的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀 | |||
;修改好以后就可以开始编译了。 | |||
== 自动下载和编译 == | |||
下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 ~/src下。 | |||
开始编译 | |||
ct-ng build | |||
经过大概3个小时的下载(2M ADSL小水管)和90分钟的编译过程,在/opt/下生成了arm-tonghuix-linux-gnueabi目录 | |||
;注:也可以提前下载好,放到~/src下,但请注意下载的文件名必须一致,否则会重新下载,下面是利用arm-unkown-linux-gnueabi模板生成交叉编译器所需要的源码文件列表 | |||
binutils-2.19.1.tar.bz2 | |||
dmalloc-5.5.2.tgz | |||
duma_2_5_15.tar.gz | |||
ecj-latest.jar | |||
expat-2.0.1.tar.gz | |||
gcc-4.3.2.tar.bz2 | |||
gdb-6.8.tar.bz2 | |||
glibc-2.9.tar.bz2 | |||
glibc-ports-2.9.tar.bz2 | |||
gmp-4.3.2.tar.bz2 | |||
libelf-0.8.13.tar.gz | |||
linux-2.6.33.12.tar.bz2 | |||
ltrace_0.5.3.orig.tar.gz | |||
mpfr-2.4.2.tar.bz2 | |||
ncurses-5.7.tar.gz | |||
strace-4.5.19.tar.bz2 | |||
== 安装交叉编译器和测试 == | |||
=== 安装交叉编译器 === | |||
刚制作好的交叉编译器其实就可以用了,但是还有些许不方便之处,我们可以进入到生成好的交叉编译器的目录 | |||
cd /opt/arm-tonghuix-linux-gnueabi/bin | |||
下面执行 | |||
./arm-tonghuix-linux-gnueabi-gcc -v | |||
应该可以看到如下这样的输出信息 | |||
Target: arm-tonghuix-linux-gnueabi | |||
Configured with: /home/tonghuix/crosstool-ng-1.11.1/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc | |||
inux-gnu --target=arm-tonghuix-linux-gnueabi --prefix=/opt/arm-tonghuix-linux-gnueabi --with-sysroot=/opt/arm-tonghuix-linux-gnueabi- | |||
arm-tonghuix-linux-gnueabi/sysroot --enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft --with-pkgversion=crosstool- | |||
NG-1.11.1 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/tonghuix | |||
/crosstool-ng-1.11.1/.build/arm-tonghuix-linux-gnueabi/build/static --with-mpfr=/home/tonghuix/crosstool-ng-1.11.1/.build/arm-tonghuix- | |||
linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/opt/arm-tonghuix-linux-gnueabi- | |||
arm-tonghuix-linux-gnueabi/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long | |||
Thread model: posix | |||
gcc version 4.3.2 (crosstool-NG-1.11.1) | |||
这样就表明我们的交叉编译器,制作成功了。 | |||
下面把交叉编译器所在的目录添加到系统PATH变量中,修改~/.bashrc文件,在其中添加: | |||
export PATH=$PATH:/opt/arm-tonghuix-linux-gnueabi/bin | |||
为了使得这个PATH生效,我们可以执行一下~/.bashrc文件 | |||
source ~/.bashrc | |||
这样我们就可以在命令行下直接使用arm-tonghuix-linux-gnueabi-gcc这样的命令了! | |||
=== 标准化安装交叉编译器 === | |||
我们在使用交叉编译器的时候一般是采用arm-tonghuix-linux-gnueabi这样的命令的,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。 | |||
cd /opt/arm-tonghuix-linux-gnueabi/bin/ | |||
那么我们在生成交叉编译器的目录下写一个link.sh脚本,新建一些软链接。 | |||
>link.sh | |||
#!/bin/sh | |||
PREFIX=arm-tonghuix-linux-gnueabi- | |||
AFTFIX=arm-linux- | |||
ln -s ${PREFIX}gcc ${AFTFIX}gcc | |||
ln -s ${PREFIX}addr2line ${AFTFIX}addr2line | |||
ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui | |||
ln -s ${PREFIX}ar ${AFTFIX}ar | |||
ln -s ${PREFIX}as ${AFTFIX}as | |||
ln -s ${PREFIX}c++ ${AFTFIX}c++ | |||
ln -s ${PREFIX}c++filt ${AFTFIX}c++filt | |||
ln -s ${PREFIX}cpp ${AFTFIX}cpp | |||
ln -s ${PREFIX}g++ ${AFTFIX}g++ | |||
ln -s ${PREFIX}gccbug ${AFTFIX}gccbug | |||
ln -s ${PREFIX}gcj ${AFTFIX}gcj | |||
ln -s ${PREFIX}gcov ${AFTFIX}gcov | |||
ln -s ${PREFIX}gdb ${AFTFIX}gdb | |||
ln -s ${PREFIX}gfortran ${AFTFIX}gfortran | |||
ln -s ${PREFIX}gprof ${AFTFIX}gprof | |||
ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump | |||
ln -s ${PREFIX}ld ${AFTFIX}ld | |||
ln -s ${PREFIX}ldd ${AFTFIX}ldd | |||
ln -s ${PREFIX}nm ${AFTFIX}nm | |||
ln -s ${PREFIX}objcopy ${AFTFIX}objcopy | |||
ln -s ${PREFIX}objdump ${AFTFIX}objdump | |||
ln -s ${PREFIX}populate ${AFTFIX}populate | |||
ln -s ${PREFIX}ranlib ${AFTFIX}ranlib | |||
ln -s ${PREFIX}readelf ${AFTFIX}readelf | |||
ln -s ${PREFIX}run ${AFTFIX}run | |||
ln -s ${PREFIX}size ${AFTFIX}size | |||
ln -s ${PREFIX}strings ${AFTFIX}strings | |||
ln -s ${PREFIX}strip ${AFTFIX}strip | |||
写完这个link.sh文件以后,我们可以执行一下 | |||
sh link.sh | |||
这样我们就得到了整个使用标准名称的交叉编译工具链,可以在makefile中使用类似arm-linux-gcc这样的名称了。 | |||
= | == 更多的配置和提醒 == | ||
用ct-ng menuconfig进入配置菜单,可以将某些选项修改成自己的配置,不过注意以下几个地方: | |||
#注意其中各个Path的配置必须准确,如果找不到就很麻烦 | |||
#可以指定不同的下载镜像,但是要确定这个镜像可用并且安全可靠 | |||
#可以不设置操作系统,也就是可以将Target OS改成bare-metal,这样的交叉编译器适合于面对硬件的裸机程序,如果不改也可以用于裸机编程。 | |||
#Kernel的版本、库的版本、gcc的版本都不建议修改,除非能够确定一套比较完善的编译源码包的版本组合 | |||
#配置结束后,建议存一个自己的配置文件,以防万一和错误。 | |||
== 外部链接 == | |||
= | [1] CodeSourcery网站制作的交叉编译起下载 [[http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite]] | ||
[2] crosstool-ng的官方网站 [[http://crosstool-ng.org/]] |
2013年10月24日 (四) 09:34的最新版本
交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编译安装,后来由于这个太麻烦于是就有类似crosstool这样的自动化配置工具。
现在之所以用crosstool-ng是因为crosstool-ng是新的用来建立交叉工具链的工具,它是crosstool的替换者。crosstool的gcc版本只能到4.1.1,无法编译版本高于2.6.29的linux内核。而crosstool-ng一直保持着更新,现在最新能够建立 gcc 4.3.2版本,可用来编译最新内核。
- 编译的系统环境是:ubuntu 10.10 + crosstool-ng 1.11.1
- 目标平台:ARMv4t, arm9tdmi,s3c2440
配置ubuntu编译环境
安装编译所需的包
sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk -y
安装结束以后就可以用了。
如果后面出现编译错误,再增加相应的包即可
安装crosstool-ng
- 1. 首先从官方网站上下载crosstool-ng的源码包 http://ymorin.is-a-geek.org/download/crosstool-ng/crosstool-ng-1.11.1.tar.bz2
- 2. 将此源码包解压缩并编译安装
tar jxvf crosstool-ng-1.11.1.tar.bz2 cd crosstool-ng--1.11.1 ./configure make sudo make install
- 3. 如果一切正常,则ct-ng命令就可以用了
注:编译的时候如果出现错误,可以利用apt-get的方式安装相应的包即可
配置自己的交叉编译器
crosstool-ng可以配置各种平台的交叉编译器,也可以构建符合自己实用条件的个性编译器。下面以ARM平台为例,制作具有一定通用性的交叉编译器。这里我们从一个现成的编译器配置开始,用例子里的arm-unknown-linux-gnueabi作为配置的基础,然后来做一个交叉编译器。
- 将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行
cp samples/arm-unknown-linux-gnueabi/crosstool.config .config
- 然后执行:
ct-ng menuconfig
- 进入配置菜单,与linux内核很类似
- 在这里,我对以下各选项稍作修改
Paths and misc options ---> ...... (${HOME}/src) Local tarballs directory # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到~/src下。 ...... (/opt/${CT_TARGET}) Prefix directory # 制作好的编译器所放置的目录 Target options ---> Target Architecture (arm) ---> # 注意看这项是不是ARM平台 ...... Floating point: (software) ---> # 对于很多ARM架构CPU来说是不支持硬浮点运算的,所以选择软件方式有更好的兼容性 ...... [*] Use EABI # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中 Toolchain options ---> ..... (tonghuix) Tuple's vendor string # 这里可以修改成你自己的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀
- 修改好以后就可以开始编译了。
自动下载和编译
下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 ~/src下。
开始编译
ct-ng build
经过大概3个小时的下载(2M ADSL小水管)和90分钟的编译过程,在/opt/下生成了arm-tonghuix-linux-gnueabi目录
- 注:也可以提前下载好,放到~/src下,但请注意下载的文件名必须一致,否则会重新下载,下面是利用arm-unkown-linux-gnueabi模板生成交叉编译器所需要的源码文件列表
binutils-2.19.1.tar.bz2 dmalloc-5.5.2.tgz duma_2_5_15.tar.gz ecj-latest.jar expat-2.0.1.tar.gz gcc-4.3.2.tar.bz2 gdb-6.8.tar.bz2 glibc-2.9.tar.bz2 glibc-ports-2.9.tar.bz2 gmp-4.3.2.tar.bz2 libelf-0.8.13.tar.gz linux-2.6.33.12.tar.bz2 ltrace_0.5.3.orig.tar.gz mpfr-2.4.2.tar.bz2 ncurses-5.7.tar.gz strace-4.5.19.tar.bz2
安装交叉编译器和测试
安装交叉编译器
刚制作好的交叉编译器其实就可以用了,但是还有些许不方便之处,我们可以进入到生成好的交叉编译器的目录
cd /opt/arm-tonghuix-linux-gnueabi/bin
下面执行
./arm-tonghuix-linux-gnueabi-gcc -v
应该可以看到如下这样的输出信息
Target: arm-tonghuix-linux-gnueabi Configured with: /home/tonghuix/crosstool-ng-1.11.1/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc inux-gnu --target=arm-tonghuix-linux-gnueabi --prefix=/opt/arm-tonghuix-linux-gnueabi --with-sysroot=/opt/arm-tonghuix-linux-gnueabi- arm-tonghuix-linux-gnueabi/sysroot --enable-languages=c,c++,fortran,java --disable-multilib --with-float=soft --with-pkgversion=crosstool- NG-1.11.1 --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-gmp=/home/tonghuix /crosstool-ng-1.11.1/.build/arm-tonghuix-linux-gnueabi/build/static --with-mpfr=/home/tonghuix/crosstool-ng-1.11.1/.build/arm-tonghuix- linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/opt/arm-tonghuix-linux-gnueabi- arm-tonghuix-linux-gnueabi/sysroot --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long Thread model: posix gcc version 4.3.2 (crosstool-NG-1.11.1)
这样就表明我们的交叉编译器,制作成功了。
下面把交叉编译器所在的目录添加到系统PATH变量中,修改~/.bashrc文件,在其中添加:
export PATH=$PATH:/opt/arm-tonghuix-linux-gnueabi/bin
为了使得这个PATH生效,我们可以执行一下~/.bashrc文件
source ~/.bashrc
这样我们就可以在命令行下直接使用arm-tonghuix-linux-gnueabi-gcc这样的命令了!
标准化安装交叉编译器
我们在使用交叉编译器的时候一般是采用arm-tonghuix-linux-gnueabi这样的命令的,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。
cd /opt/arm-tonghuix-linux-gnueabi/bin/
那么我们在生成交叉编译器的目录下写一个link.sh脚本,新建一些软链接。
>link.sh
#!/bin/sh PREFIX=arm-tonghuix-linux-gnueabi- AFTFIX=arm-linux- ln -s ${PREFIX}gcc ${AFTFIX}gcc ln -s ${PREFIX}addr2line ${AFTFIX}addr2line ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui ln -s ${PREFIX}ar ${AFTFIX}ar ln -s ${PREFIX}as ${AFTFIX}as ln -s ${PREFIX}c++ ${AFTFIX}c++ ln -s ${PREFIX}c++filt ${AFTFIX}c++filt ln -s ${PREFIX}cpp ${AFTFIX}cpp ln -s ${PREFIX}g++ ${AFTFIX}g++ ln -s ${PREFIX}gccbug ${AFTFIX}gccbug ln -s ${PREFIX}gcj ${AFTFIX}gcj ln -s ${PREFIX}gcov ${AFTFIX}gcov ln -s ${PREFIX}gdb ${AFTFIX}gdb ln -s ${PREFIX}gfortran ${AFTFIX}gfortran ln -s ${PREFIX}gprof ${AFTFIX}gprof ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump ln -s ${PREFIX}ld ${AFTFIX}ld ln -s ${PREFIX}ldd ${AFTFIX}ldd ln -s ${PREFIX}nm ${AFTFIX}nm ln -s ${PREFIX}objcopy ${AFTFIX}objcopy ln -s ${PREFIX}objdump ${AFTFIX}objdump ln -s ${PREFIX}populate ${AFTFIX}populate ln -s ${PREFIX}ranlib ${AFTFIX}ranlib ln -s ${PREFIX}readelf ${AFTFIX}readelf ln -s ${PREFIX}run ${AFTFIX}run ln -s ${PREFIX}size ${AFTFIX}size ln -s ${PREFIX}strings ${AFTFIX}strings ln -s ${PREFIX}strip ${AFTFIX}strip
写完这个link.sh文件以后,我们可以执行一下
sh link.sh
这样我们就得到了整个使用标准名称的交叉编译工具链,可以在makefile中使用类似arm-linux-gcc这样的名称了。
更多的配置和提醒
用ct-ng menuconfig进入配置菜单,可以将某些选项修改成自己的配置,不过注意以下几个地方:
- 注意其中各个Path的配置必须准确,如果找不到就很麻烦
- 可以指定不同的下载镜像,但是要确定这个镜像可用并且安全可靠
- 可以不设置操作系统,也就是可以将Target OS改成bare-metal,这样的交叉编译器适合于面对硬件的裸机程序,如果不改也可以用于裸机编程。
- Kernel的版本、库的版本、gcc的版本都不建议修改,除非能够确定一套比较完善的编译源码包的版本组合
- 配置结束后,建议存一个自己的配置文件,以防万一和错误。
外部链接
[1] CodeSourcery网站制作的交叉编译起下载 [[1]]
[2] crosstool-ng的官方网站 [[2]]