Crosstool-ng交叉编译器arm920t制作(ubuntu14.04)

版权声明:转载请附带原博主的网址 https://blog.csdn.net/qq_43260665/article/details/89609828

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
老办法:其他问题不会就百度,不行就谷歌。。。

猜你喜欢

转载自blog.csdn.net/qq_43260665/article/details/89609828