Crosstool-ng 制作交叉编译器:
可能遇到的问题可在这里解决:https://www.crifan.com/files/doc/docbook/crosstool_ng/release/htmls/crosstool_ng_common_errors.html#not_find_curses_header
预先说明制作时需要的压缩包(由于下载较慢,可预先下载)
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0/tarballs$ ls
binutils-2.20.1a.tar.bz2 gcc-4.4.6.tar.bz2 glibc-ports-2.9.tar.bz2 linux-3.5.tar.bz2 mpfr-3.0.0.tar.xz ppl-0.11.tar.lzma
cloog-ppl-0.15.11.tar.gz gcc-4.6.0.tar.bz2 gmp-4.3.2.tar.bz2 mpc-0.9.tar.gz ppl-0.10.2.tar.gz
cloog-ppl-0.15.9.tar.gz glibc-2.9.tar.bz2 libelf_0.8.13.orig.tar.gz mpfr-2.4.2.tar.xz ppl-0.11.tar.gz
1.下载并安装crosstool-ng
sudo apt-get install automake
sudo apt-get install autoconf
sudo apt-get install bison
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install make
sudo apt-get install texinfo
sudo apt-get install flex
sudo apt-get install cmake
sudo apt-get install gperf
mkdir crosstool
cd crosstool/
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.16.0.tar.bz2
tar -xjf crosstool-ng-1.16.0.tar.bz2
cd crosstool-ng-1.16.0/
./configure --prefix=`pwd`
此时可能出现错误:
...
checking for gzip... gzip
checking for bzip2... bzip2
checking for patch... /usr/bin/patch
checking for bash >= 3.1... /bin/bash
checking for GNU awk... no
configure: error: could not find GNU awk
解决办法:
sudo apt-get install gawk
./configure --prefix=`pwd`
此时可能出错:
...
checking for bash >= 3.1... /bin/bash
checking for GNU awk... /usr/bin/awk
checking for GNU make >= 3.80... /usr/bin/make
checking whether /usr/bin/make sets $(MAKE)... yes
checking for GNU libtool >= 1.5.26... no
configure: error: could not find GNU libtool >= 1.5.26
解决办法:
sudo apt-get install libtool
./configure --prefix=`pwd`
可能出现错误:
...
checking for ncurses.h... no
checking curses.h usability... no
checking curses.h presence... no
checking for curses.h... no
configure: error: could not find curses header, required for the kconfig frontends
z
解决办法:
sudo apt-get install libncurses5-dev
./configure --prefix=`pwd`
...
checking for ncurses.h... yes
checking for library containing initscr... -lncurses
configure: creating ./config.status
config.status: creating Makefile
成功创建Makefile
make && make install
...
ct-ng.1.16.0/'
INST 'docs/*.txt'
MKDIR '/home/zhanghang/crosstool/crosstool-ng-1.16.0/share/man/man1/'
INST 'ct-ng.1.gz'
For auto-completion, do not forget to install 'ct-ng.comp' into
your bash completion directory (usually /etc/bash_completion.d)
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ ls samples/
alphaev56-unknown-linux-gnu mips-ar2315-linux-gnu
alphaev67-unknown-linux-gnu mipsel-sde-elf
arm-bare_newlib_cortex_m3_nommu-eabi mipsel-unknown-linux-gnu
arm-cortex_a15-linux-gnueabi mips-malta-linux-gnu
arm-cortex_a8-linux-gnueabi mips-unknown-elf
arm-davinci-linux-gnueabi mips-unknown-linux-uclibc
armeb-unknown-eabi powerpc-405-linux-gnu
armeb-unknown-linux-gnueabi powerpc64-unknown-linux-gnu
armeb-unknown-linux-uclibcgnueabi powerpc-860-linux-gnu
arm-unknown-eabi powerpc-e300c3-linux-gnu
arm-unknown-linux-gnueabi powerpc-e500v2-linux-gnuspe
arm-unknown-linux-uclibcgnueabi powerpc-unknown-linux-gnu
avr32-unknown-none powerpc-unknown-linux-uclibc
bfin-unknown-linux-uclibc powerpc-unknown_nofpu-linux-gnu
i586-geode-linux-uclibc s390-ibm-linux-gnu
i586-mingw32msvc,i686-none-linux-gnu s390x-ibm-linux-gnu
i686-nptl-linux-gnu samples.mk
i686-pc-mingw32 sh4-unknown-linux-gnu
m68k-unknown-elf x86_64-unknown-linux-gnu
mips64el-n32-linux-uclibc x86_64-unknown-linux-uclibc
mips64el-n64-linux-uclibc
2.crosstool-ng的menuconfig配置:
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ cp samples/arm-cortex_a8-linux-gnueabi/crosstool.config .config
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ export TREM=vt100
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ ./ct-ng menuconfig
**进入到 Paths and misc options —>**可以看到有:
``
第一行为下载安装包路径,后面会用到,可自己修改
第四行为交叉编译器的安装路径,可自己修改
这里我们修改为如下:
这里的CT_ARCH_TUNE在下面的Target option中,其值为arm920t。
进入到 Target options —>
修改为:
进入到Toolchain options —>
同样修改为arm920t:生成交叉编译器前缀带的信息
进入到 C-library —>
修改最下面为:
取消掉 Debug facilities —> 中所有选项
save:
3.编译
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ ./ct-ng build
[INFO ] Performing some trivial sanity checks
[INFO ] Build started 20190427.033009
[INFO ] Building environment variables
[WARN ] Directory '/home/zhanghang/crosstool/crosstool-ng-1.16.0/tarballs' does not exist.
[WARN ] Will not save downloaded tarballs to local storage.
[EXTRA] Preparing working directories
[ERROR]
[ERROR] >>
[ERROR] >> Build failed in step '(top-level)'
[ERROR] >>
[ERROR] >> Error happened in: CT_DoExecLog[scripts/functions@172]
[ERROR] >> called from: main[scripts/crosstool-NG.sh@245]
[ERROR] >>
[ERROR] >> For more info on this error, look at the file: 'build.log'
[ERROR] >> There is a list of known issues, some with workarounds, in:
[ERROR] >> 'share/doc/crosstool-ng/ct-ng.1.16.0/B - Known issues.txt'
[ERROR]
[ERROR] (elapsed: 0:00.22)
[00:00] / make: *** [build] Error 1
提示没有tarballs文件夹,在上面说过会用到tarballs文件夹
由于我是在 / 下安装,需要sudo权限
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ mkdir tarballs
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ sudo ./ct-ng build
查看错误信息:
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ vim build.log
原因是下载地址失效,所以这些必要资源需要我们手动下载了。
此时tarballs文件夹就有用了,它用来放我们所需要的资源,需要资源如下。
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0/tarballs$ ls
binutils-2.20.1a.tar.bz2 gcc-4.4.6.tar.bz2 glibc-ports-2.9.tar.bz2 linux-3.5.tar.bz2 ppl-0.10.2.tar.gz
cloog-ppl-0.15.9.tar.gz glibc-2.9.tar.bz2 gmp-4.3.2.tar.bz2 mpfr-2.4.2.tar.xz
再次编译:
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ sudo ./ct-ng build
可能报错:
原因是MPFR版本太低,需要提高版本为3.0.0:
修改后,编译时会自动下载:
mpfr-3.0.0.tar.xz
再编译,可能出错:
同上修改ppl版本,同时修改CLooG/ppl版本(不然会报错 : [ERROR] checking for version 0.10 of PPL… configure: error: Can’t find cor…)
此时再编译时,编译时会自动下载对应的高版本
cloog-ppl-0.15.11.tar.gz
ppl-0.11.tar.gz或ppl-0.11.tar.lzma
此时可能还需手动下载一个文件(编译时下载网址失效,如下)
手动下载后放在tarballs下:
mpc-0.9.tar.gz
继续编译(心态炸了。。。)
打开build.log查看,可以发现有一堆的Undefined。。。
这个错误可能是由于gcc编译器版本较高造成,需要降低gcc版本,下载gcc-4.6.0.tar.bz2压缩包到tarballs下,同时修改menuconfig如下选项为gcc-4.6.0
继续编译:
安装交叉编译器成功!!!
zhanghang@ubuntu:~/crosstool/crosstool-ng-1.16.0$ cd /opt/xtools/arm920t/bin/
zhanghang@ubuntu:/opt/xtools/arm920t/bin$ ls
arm-arm920t-linux-gnueabi-addr2line arm-arm920t-linux-gnueabi-cpp arm-arm920t-linux-gnueabi-gprof arm-arm920t-linux-gnueabi-populate
arm-arm920t-linux-gnueabi-ar arm-arm920t-linux-gnueabi-ct-ng.config arm-arm920t-linux-gnueabi-ld arm-arm920t-linux-gnueabi-ranlib
arm-arm920t-linux-gnueabi-as arm-arm920t-linux-gnueabi-g++ arm-arm920t-linux-gnueabi-ldd arm-arm920t-linux-gnueabi-readelf
arm-arm920t-linux-gnueabi-c++ arm-arm920t-linux-gnueabi-gcc arm-arm920t-linux-gnueabi-nm arm-arm920t-linux-gnueabi-size
arm-arm920t-linux-gnueabi-cc arm-arm920t-linux-gnueabi-gcc-4.6.0 arm-arm920t-linux-gnueabi-objcopy arm-arm920t-linux-gnueabi-strings
arm-arm920t-linux-gnueabi-c++filt arm-arm920t-linux-gnueabi-gcov arm-arm920t-linux-gnueabi-objdump arm-arm920t-linux-gnueabi-strip
查看版本:
zhanghang@ubuntu:/opt/xtools/arm920t$ /opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=/opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/opt/xtools/arm920t/libexec/gcc/arm-arm920t-linux-gnueabi/4.6.0/lto-wrapper
Target: arm-arm920t-linux-gnueabi
Configured with: /home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/src/gcc-4.6.0/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-arm920t-linux-gnueabi --prefix=/opt/xtools/arm920t --with-sysroot=/opt/xtools/arm920t/arm-arm920t-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv4t --with-cpu=arm9tdmi --with-tune=arm920t --with-float=soft --with-pkgversion='crosstool-NG 1.16.0' --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-mpfr=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-mpc=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-ppl=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-cloog=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-libelf=/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm -L/home/zhanghang/crosstool/crosstool-ng-1.16.0/.build/arm-arm920t-linux-gnueabi/buildtools/lib -lpwl' --enable-threads=posix --enable-target-optspace --disable-nls --disable-multilib --with-local-prefix=/opt/xtools/arm920t/arm-arm920t-linux-gnueabi/sysroot --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.6.0 (crosstool-NG 1.16.0) //最后用的gcc4.6.0的编译器,生成的也是对用版本的交叉编译器
接下来做一个小测试:
zhanghang@ubuntu:~$ vim hello.c
#include<stdio.h>
int main()
{
printf("Hello word\n");
return 0;
}
使用gcc编译器编译
zhanghang@ubuntu:~$ gcc hello.c -o hello
zhanghang@ubuntu:~$ du -h hello
12K hello
zhanghang@ubuntu:~$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=7b1421b656bb9c153707ba0082498c10a1243db7, not stripped
使用arm920t交叉编译器编译:
zhanghang@ubuntu:~$ /opt/xtools/arm920t/bin/arm-arm920t-linux-gnueabi-gcc hello.c -o hello_arm
zhanghang@ubuntu:~$ du -h hello_arm
8.0K hello_arm
zhanghang@ubuntu:~$ file hello_arm
hello_arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
相关博客:https://www.jianshu.com/p/a513590de6b8
老办法:其他问题不会就百度,不行就谷歌。。。