简介

crosstool-ng,全称是crosstool Next Generation,即下一代crosstool。crosstool是个交叉编译器的制作工具,但是做的不够好,于是有人(Yann E. MORIN)弄出了个更好的——crosstool-ng。crosstool-ng的特点:

支持menuconfig(类似于Linux内核配置)

支持众多的架构

可选多种不同的C库等模块

提供示例配置

支持多种主机编译环境:各种Linux发行版,Cygwin等

安装

#yum安装需要的包
yum install -y gperf bison flex texinfo help2man gcc-c++ expat-devel patch ncurses-devel automake libstdc++-static


#下载crosstool-ng并源码编译 设置软连接
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.xz
tar -Jvxf crosstool-ng-1.23.0.tar.xz
cd crosstool-ng-1.23.0
./configure --prefix=/usr/local/crosstool-ng
make
make install
ln -s  /usr/local/crosstool-ng/bin/ct-ng /usr/local/bin/ct-ng

制作交叉编译工具链

1.使用ct-ng list-samples命令查看具有哪些默认配置。具体如下:

[G..]   aarch64-rpi3-linux-gnueabi
[G..]   aarch64-unknown-linux-gnueabi
[G..]   aarch64-unknown-linux-uclibcgnueabi
[G..]   alphaev56-unknown-linux-gnu
[G..]   alphaev67-unknown-linux-gnu
[G..]   arm-bare_newlib_cortex_m3_nommu-eabi
[G..]   arm-cortex_a15-linux-gnueabihf
[G.X]   arm-cortexa5-linux-uclibcgnueabihf
[G..]   arm-cortex_a8-linux-gnueabi
[G.X]   arm-cortexa9_neon-linux-gnueabihf
[G.X]   x86_64-w64-mingw32,arm-cortexa9_neon-linux-gnueabihf
[G..]   armeb-unknown-eabi
[G..]   armeb-unknown-linux-gnueabi
[G..]   armeb-unknown-linux-uclibcgnueabi
[G..]   arm-multilib-linux-uclibcgnueabi
[G..]   arm-nano-eabi
[G..]   arm-unknown-eabi
[G..]   arm-unknown-linux-gnueabi
[G.X]   arm-unknown-linux-musleabi
[G..]   arm-unknown-linux-uclibcgnueabi
[G.X]   arm-unknown-linux-uclibcgnueabihf
[G..]   armv6-nommu-linux-uclibcgnueabi
[G..]   armv6-rpi-linux-gnueabi
[G..]   armv7-rpi2-linux-gnueabihf
[G..]   armv8-rpi3-linux-gnueabihf
[G..]   avr
[G..]   i586-geode-linux-uclibc
[G..]   i686-centos6-linux-gnu
[G..]   i686-centos7-linux-gnu
[G..]   i686-nptl-linux-gnu
[G..]   i686-ubuntu12.04-linux-gnu
[G..]   i686-ubuntu14.04-linux-gnu
[G..]   i686-ubuntu16.04-linux-gnu
[G.X]   i686-w64-mingw32
[G..]   m68k-unknown-elf
[G..]   m68k-unknown-uclinux-uclibc
[G..]   powerpc-unknown-linux-uclibc,m68k-unknown-uclinux-uclibc
[G..]   mips64el-multilib-linux-uclibc
[G..]   mips-ar2315-linux-gnu
[G..]   mipsel-multilib-linux-gnu
[G..]   mipsel-sde-elf
[G..]   mipsel-unknown-linux-gnu
[G..]   mips-malta-linux-gnu
[G..]   mips-unknown-elf
[G..]   mips-unknown-linux-uclibc
[G.X]   i686-w64-mingw32,nios2-spico-elf
[G..]   powerpc-405-linux-gnu
[G..]   powerpc64le-unknown-linux-gnu
[G..]   powerpc64-multilib-linux-gnu
[G..]   powerpc64-unknown-linux-gnu
[G..]   powerpc-860-linux-gnu
[G..]   powerpc-e300c3-linux-gnu
[G..]   powerpc-e500v2-linux-gnuspe
[G..]   x86_64-multilib-linux-uclibc,powerpc-unknown-elf
[G..]   powerpc-unknown-linux-gnu
[G..]   powerpc-unknown-linux-uclibc
[G..]   powerpc-unknown_nofpu-linux-gnu
[G.X]   s390-ibm-linux-gnu
[G..]   s390x-ibm-linux-gnu
[G..]   sh4-multilib-linux-gnu
[G..]   sh4-multilib-linux-uclibc
[G..]   sh4-unknown-linux-gnu
[G..]   sparc64-multilib-linux-gnu
[G..]   sparc-leon-linux-uclibc
[G..]   sparc-unknown-linux-gnu
[G..]   x86_64-centos6-linux-gnu
[G..]   x86_64-centos7-linux-gnu
[G..]   x86_64-multilib-linux-gnu
[G.X]   x86_64-multilib-linux-musl
[G..]   x86_64-multilib-linux-uclibc
[G.X]   x86_64-w64-mingw32,x86_64-pc-linux-gnu
[G..]   x86_64-ubuntu12.04-linux-gnu
[G..]   x86_64-ubuntu14.04-linux-gnu
[G..]   x86_64-ubuntu16.04-linux-gnu
[G..]   x86_64-unknown-linux-gnu
[G..]   x86_64-unknown-linux-uclibc
[G.X]   x86_64-w64-mingw32
[G..]   xtensa-fsf-linux-uclibc

列表中名词解析参考:crosstool-ng 交叉工具链默认配置 名词解释  crosstool-ng 交叉工具链默认配置 名词解释_whatday的专栏-CSDN博客

2.以其中的 arm-unknown-linux-gnueabi 配置为基础,进行一些自定义配置:必须是非root用户 这里以test用户为示例

cd /home/test
mkdir -p crosstool-ng_build/src crosstool-ng_build/arm-unknown-linux-gnueabi
# 注意 /home/test/crosstool-ng_lib/ 里是 crosstool-ng 交叉编译需要的依赖库
cp /home/test/crosstool-ng_lib/* /home/test/crosstool-ng_build/src
cd crosstool-ng_build/arm-unknown-linux-gnueabi/
ct-ng arm-unknown-linux-gnueabi
ct-ng menuconfig

弹出配置对话框 修改 Paths and misc options --->(${HOME}/src) Local tarballs directory :指定下载的源码保存的位置,根据自己情况修改为:/home/test/crosstool-ng_build/src

选中​ Forbid downloads:不从网络下载需要的源码包 因为自动下载速度太慢 自己在windows用迅雷下载更快些

Target options  --->Emit assembly for CPU 设置CPU内核 

例如 armv4可设置为arm920t    armv5可设置为arm1022e   armv6可设置为arm1136j-s

具体可参考:

ARM架构和ARM核区别和联系   ARM架构和ARM核区别和联系_whatday的专栏-CSDN博客_arm核

crosstool-ng配置中的Architecture level、Emit assembly for CPU 、Tune for CPU  crosstool-ng配置中的Architecture level、Emit assembly for CPU 、Tune for CPU_whatday的专栏-CSDN博客

选择GCC版本:C compiler  ---> gcc version (6.3.0)   

Operating System  --->Linux kernel version (3.19.8 (EOL))  ---> 

这个项是选择内核版本的 当然选择后在构建工具链时 需要提供相应的内核源码包

C-library  ---> Minimum supported kernel version (Same as kernel headers (default))  --->

使用gcc编译后的程序  能够运行的最低的内核版本 

假如gcc内核版本选择的3.19.8 系统环境是3.10.0 此时运行该gcc编译的程序会报错:FATAL: kernel too old

就是因为这个选项造成的  这里修改为 Let ./configure decide  就不会有这个问题了

3.使用ct-ng build命令开始制作交叉工具编译链。

这是使用root权限会提示错误[ERROR]  You must NOT be root to run crosstool-NG 

用普通用户运行 ct-ng build 因为没有需求的源码包且配置了不允许网络自动下载 所以会出现下列错误

[ERROR]  >>  Build failed in step 'Retrieving needed toolchain components' tarballs'
[ERROR]  >>        called in step '(top-level)'

cat build.log可以看到需求的源码包名

[DEBUG]    Trying to retrieve an already downloaded copy of 'autoconf-2.69'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tar.xz'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tar.lzma'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tar.bz2'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tar.gz'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tgz'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.tar'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69.zip'
[DEBUG]    Trying '/home/test/Desktop/crosstool-ng_build/src/autoconf-2.69'
[DEBUG]    Not allowed to download from the Internet, aborting autoconf-2.69 download

在windows中google直接搜索autoconf-2.69.tar.xz 迅雷下载 传到centos7的${HOME}/crosstool-ng_build/src目录下 上 再次 ct-ng build 依次循环下载各个需要的包 列表如下:

[root@bogon crosstool-ng_build]# ll src/
total 283444
-rwxrwxrwx. 1 root root  1214744 Apr 24  2012 autoconf-2.69.tar.xz
-rwxrwxrwx. 1 root root  1496708 Feb 10 09:09 automake-1.15.tar.xz
-rwxrwxrwx. 1 root root 36228252 Feb 10 09:47 binutils-2.28.tar.gz
-rwxrwxrwx. 1 root root   240479 Feb 10 09:52 duma_2_5_15.tar.gz
-rwxrwxrwx. 1 root root   414352 Feb 10 10:22 expat-2.2.0.tar.bz2
-rwxrwxrwx. 1 root root 99903185 Feb 10 09:49 gcc-6.3.0.tar.bz2
-rwxrwxrwx. 1 root root 19225392 Feb 10 09:53 gdb-7.12.1.tar.xz
-rwxrwxrwx. 1 root root  7209808 Feb 10 09:44 gettext-0.19.8.1.tar.xz
-rwxrwxrwx. 1 root root 13873900 Feb 10 09:50 glibc-2.25.tar.xz
-rwxrwxrwx. 1 root root  1946336 Feb 10 09:22 gmp-6.1.2.tar.xz
-rwxrwxrwx. 1 root root  1449164 Feb 10 09:25 isl-0.16.1.tar.xz
-rwxrwxrwx. 1 root root   148529 Feb 10 09:26 libelf-0.8.13.tar.gz
-rwxrwxrwx. 1 root root  5264188 Feb 10 09:42 libiconv-1.15.tar.gz
-rwxrwxrwx. 1 root root   973080 Feb 16  2015 libtool-2.4.6.tar.xz
-rwxrwxrwx. 1 root root 94235192 Feb 10 09:19 linux-4.10.8.tar.xz
-rwxrwxrwx. 1 root root   482658 Feb 10 09:55 ltrace_0.7.3.orig.tar.bz2
-rwxrwxrwx. 1 root root   669925 Feb 10 09:25 mpc-1.0.3.tar.gz
-rwxrwxrwx. 1 root root  1126668 Feb 10 09:24 mpfr-3.1.5.tar.xz
-rwxrwxrwx. 1 root root  3131891 Feb 10 09:40 ncurses-6.0.tar.gz
-rwxrwxrwx. 1 root root   966668 Feb 10 09:57 strace-4.16.tar.xz

设置权限 chmod 777 -R ${HOME}/crosstool-ng_build/src 再次ct-ng build 经过一个小时的等待会出现完成提示 如下

[INFO ]  =================================================================
[INFO ]  Finalizing the toolchain's directory
[INFO ]    Stripping all toolchain executables
[EXTRA]    Installing the populate helper
[EXTRA]    Installing a cross-ldd helper
[EXTRA]    Creating toolchain aliases
[INFO ]  Finalizing the toolchain's directory: done in 1.51s (at 56:57)
[INFO ]  Build completed at 20190210.230611
[INFO ]  (elapsed: 56:56.82)
[INFO ]  Finishing installation (may take a few seconds)...
[56:57] / [test@bogon arm-unknown-linux-gnueabi]$ 

完成后,交叉工具编译链的位置在/home/tools/${CT_TARGET}目录下

[root@bogon bin]# pwd
/home/test/x-tools/arm-unknown-linux-gnueabi/bin
[root@bogon bin]# ll
total 30256
-r-xr-xr-x. 1 test test  841072 Feb 11 01:56 arm-unknown-linux-gnueabi-addr2line
-r-xr-xr-x. 2 test test  869656 Feb 11 01:56 arm-unknown-linux-gnueabi-ar
-r-xr-xr-x. 2 test test 1451520 Feb 11 01:56 arm-unknown-linux-gnueabi-as
-r-xr-xr-x. 2 test test  817280 Feb 11 01:56 arm-unknown-linux-gnueabi-c++
lrwxrwxrwx. 1 test test      29 Feb 11 01:46 arm-unknown-linux-gnueabi-cc -> arm-unknown-linux-gnueabi-gcc
-r-xr-xr-x. 1 test test  836528 Feb 11 01:56 arm-unknown-linux-gnueabi-c++filt
-r-xr-xr-x. 1 test test  817280 Feb 11 01:56 arm-unknown-linux-gnueabi-cpp
-r-xr-xr-x. 1 test test    3177 Feb 11 00:58 arm-unknown-linux-gnueabi-ct-ng.config
-r-xr-xr-x. 1 test test 2457632 Feb 11 01:56 arm-unknown-linux-gnueabi-dwp
-r-xr-xr-x. 1 test test   31552 Feb 11 01:56 arm-unknown-linux-gnueabi-elfedit
-r-xr-xr-x. 2 test test  817280 Feb 11 01:56 arm-unknown-linux-gnueabi-g++
-r-xr-xr-x. 2 test test  813184 Feb 11 01:56 arm-unknown-linux-gnueabi-gcc
-r-xr-xr-x. 2 test test  813184 Feb 11 01:56 arm-unknown-linux-gnueabi-gcc-6.3.0
-r-xr-xr-x. 1 test test   27152 Feb 11 01:56 arm-unknown-linux-gnueabi-gcc-ar
-r-xr-xr-x. 1 test test   27152 Feb 11 01:56 arm-unknown-linux-gnueabi-gcc-nm
-r-xr-xr-x. 1 test test   27152 Feb 11 01:56 arm-unknown-linux-gnueabi-gcc-ranlib
-r-xr-xr-x. 1 test test  429344 Feb 11 01:56 arm-unknown-linux-gnueabi-gcov
-r-xr-xr-x. 1 test test  388408 Feb 11 01:56 arm-unknown-linux-gnueabi-gcov-tool
-r-xr-xr-x. 1 test test 5295208 Feb 11 01:56 arm-unknown-linux-gnueabi-gdb
-r-xr-xr-x. 1 test test  903760 Feb 11 01:56 arm-unknown-linux-gnueabi-gprof
-r-xr-xr-x. 1 test test     143 Feb 11 01:07 arm-unknown-linux-gnueabi-ld
-r-xr-xr-x. 2 test test 1350528 Feb 11 01:56 arm-unknown-linux-gnueabi-ld.bfd
-r-xr-xr-x. 1 test test   15078 Feb 11 01:56 arm-unknown-linux-gnueabi-ldd
-r-xr-xr-x. 2 test test 4584576 Feb 11 01:56 arm-unknown-linux-gnueabi-ld.gold
-r-xr-xr-x. 2 test test  854064 Feb 11 01:56 arm-unknown-linux-gnueabi-nm
-r-xr-xr-x. 2 test test 1033232 Feb 11 01:56 arm-unknown-linux-gnueabi-objcopy
-r-xr-xr-x. 2 test test 1308880 Feb 11 01:56 arm-unknown-linux-gnueabi-objdump
-r-xr-xr-x. 1 test test   10448 Feb 11 01:56 arm-unknown-linux-gnueabi-populate
-r-xr-xr-x. 2 test test  869656 Feb 11 01:56 arm-unknown-linux-gnueabi-ranlib
-r-xr-xr-x. 2 test test  505760 Feb 11 01:56 arm-unknown-linux-gnueabi-readelf
-r-xr-xr-x. 1 test test  840912 Feb 11 01:56 arm-unknown-linux-gnueabi-size
-r-xr-xr-x. 1 test test  841072 Feb 11 01:56 arm-unknown-linux-gnueabi-strings
-r-xr-xr-x. 2 test test 1033232 Feb 11 01:56 arm-unknown-linux-gnueabi-strip
[root@bogon bin]# 

工具详细解释参考: Binutils工具集 GCC工具集介绍  Binutils工具集 GCC工具集介绍_whatday的专栏-CSDN博客_gcc工具集

出现以下信息说明交叉编译工具链有效

[root@bogon bin]# ./arm-unknown-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-unknown-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/test/x-tools/arm-unknown-linux-gnueabi/libexec/gcc/arm-unknown-linux-gnueabi/6.3.0/lto-wrapper
Target: arm-unknown-linux-gnueabi
Configured with: /home/test/Desktop/crosstool-ng_build/arm-unknown-linux-gnueabi/.build/src/gcc-6.3.0/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-unknown-linux-gnueabi --prefix=/home/test/x-tools/arm-unknown-linux-gnueabi --with-sysroot=/home/test/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --enable-languages=c,c++ --with-float=soft --with-pkgversion='crosstool-NG crosstool-ng-1.23.0' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/test/Desktop/crosstool-ng_build/arm-unknown-linux-gnueabi/.build/arm-unknown-linux-gnueabi/buildtools --with-mpfr=/home/test/Desktop/crosstool-ng_build/arm-unknown-linux-gnueabi/.build/arm-unknown-linux-gnueabi/buildtools --with-mpc=/home/test/Desktop/crosstool-ng_build/arm-unknown-linux-gnueabi/.build/arm-unknown-linux-gnueabi/buildtools --with-isl=/home/test/Desktop/crosstool-ng_build/arm-unknown-linux-gnueabi/.build/arm-unknown-linux-gnueabi/buildtools --enable-lto --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/test/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --enable-long-long
Thread model: posix
gcc version 6.3.0 (crosstool-NG crosstool-ng-1.23.0) 
[root@bogon bin]# 


标准化安装交叉编译器

由于标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的  vim link.sh

#!/bin/sh
PREFIX=arm-unknown-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

保存并执行  这样我们就得到了整个使用标准名称的交叉编译工具链

Logo

更多推荐