此前遇到一个很好的WIFI音箱项目,打算移植到JZ2440V3上面。但是百问网提供的最高版本的交叉编译器4.3.2是不支持C++11标准的,而项目中却用到了C++0x和C++11的特性,这就意味着WIFI音箱项目无法移植。但我又不肯向现实妥协,所以参考各方资料,制作出了4.8.2版本的交叉编译器。过程比较曲折,但成果显而易见。
随后我用该编译器重做了内核、文件系统,发现无法正常启动,随后在韦老师的帮助下,解决了此问题,详情可参看 :
经过此前的一番折腾,深知过程的不易,同时也在寻找新的解决方案。最近找到了一种简便的方式,现在我就来重做编译器,希望能为新人提供一些参考。
使用到的就是 crosstool-ng ,Crosstool-NG是一个通用的(交叉)工具链制作器。它支持许多架构和组件,并具有简单而强大的menuconfig风格界面。
下面开始正文:
编译环境:
- Ubuntu 14.04 64Bit Desktop LTS
- GCC 4.8.4
- PC平台其他的软件
- linux-3.4.2.tar.bz2
编译目标:
arm-jz2440-linux-gnueabi 4.8.2工具链
1.下载,解压,配置,安装
mm@realtek:~$
mm@realtek:~$ wget -c http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.20.0.tar.xz
mm@realtek:~$ tar xf crosstool-ng-1.20.0.tar.xz
mm@realtek:~$ cd crosstool-ng-1.20.0
mm@realtek:~/crosstool-ng-1.20.0$ ./configure
mm@realtek:~/crosstool-ng-1.20.0$ make
mm@realtek:~/crosstool-ng-1.20.0$ sudo make install
mm@realtek:~/crosstool-ng-1.20.0$ cd ..
mm@realtek:~$
2.在当前目录下创建三个目录:build用来编译源码,packages 存放已有的源代码或者是下载的源代码,toolchain 存放制作好的编译器
mm@realtek:~$ mkdir build packages toolchain
3.拷贝crosstool-ng提供的配置样例,此后的操作会在.config的基础上进行修改
mm@realtek:~$ cp crosstool-ng-1.20.0/samples/arm-unknown-linux-gnueabi/crosstool.config build/.config
4.唤出图形界面进行配置
mm@realtek:~$ cd build
mm@realtek:~/build$ ct-ng menuconfig
5.主要配置如下:
- Paths and misc options —>
(/home/mm/packages) Local tarballs directory //本地源码包存放路径
(/home/mm/toolchain) Prefix directory //生成的编译器的安装位置 - Target options —> //下面这四个是根据S3C2440的芯片属性设置的
(armv4t)Architecture level
(arm9tdmi)Emit assembly for CPU
(arm920t)Tune for CPU
Floating point: (software (no FPU)) —>
(X) software (no FPU) - Toolchain options —>
(wheretogo0815@163.com) Toolchain bug URL //设置编译器bug的反馈地址
(jz2440) Tuple’s vendor string //这个会将 arm-unknown-linux-gnueabi 中的unknown 换成jz2440 - Operating System —>
Target OS (linux) —>
[*] custom tarball or directory //因为第三期视频一直用的都是3.4.2的内核,所以还是维持原状
(/home/mm/packages/linux-3.4.2.tar.bz2) Path to custom source, tarball or directory //文件位置
(3.4.2) Custom Linux version //内核版本 - Binary utilities —>
binutils version (2.22) —> //选择一个binutils版本,用来生成 ar,ld,readelf等程序 - C-library —>
C library (glibc) —> //选择glibc或者uClibc,这里我选择glibc
glibc version (2.18) —> //选择glibc的版本 - C compiler —>
C compiler (gcc) —> //选择gcc
gcc version (4.8.2) —> //选择gcc的版本
还有很多可设置的地方,有兴趣可以尝试一下。
6..因为crosstool-ng-1.20.0提供的内核版本是3.4.x,为了少出问题,还是配置成了第三期视频用的3.4.2.这就需要我们先把内核源码包事先放到/home/mm/packages目录下,我这里直接下载。
mm@realtek:~/build$ wget -O ~/packages/linux-3.4.2.tar.bz2 -c https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.2.tar.bz2
7.开始编译,经过约30~60分钟,不出意外,编译器就制作好了,log信息如下:
mm@realtek:~/build$ ct-ng build
[INFO ] Performing some trivial sanity checks
[INFO ] Build started 20170807.201929
[INFO ] Building environment variables
[EXTRA] Preparing working directories
[EXTRA] Installing user-supplied crosstool-NG configuration
[EXTRA] =================================================================
[EXTRA] Dumping internal crosstool-NG configuration
[EXTRA] Building a toolchain for:
[EXTRA] build = x86_64-unknown-linux-gnu
[EXTRA] host = x86_64-unknown-linux-gnu
[EXTRA] target = arm-jz2440-linux-gnueabi
[EXTRA] Dumping internal crosstool-NG configuration: done in 0.07s (at 00:06)
[INFO ] =================================================================
[INFO ] Retrieving needed toolchain components' tarballs
[EXTRA] Using 'linux-custom' from custom location
[INFO ] Retrieving needed toolchain components' tarballs: done in 0.11s (at 00:06)
[INFO ] =================================================================
[INFO ] Extracting and patching toolchain components
[INFO ] Extracting and patching toolchain components: done in 1.27s (at 00:08)
[INFO ] =================================================================
[INFO ] Installing GMP for host
[EXTRA] Configuring GMP
[EXTRA] Building GMP
[EXTRA] Installing GMP
[INFO ] Installing GMP for host: done in 38.80s (at 00:46)
[INFO ] =================================================================
[INFO ] Installing MPFR for host
[EXTRA] Configuring MPFR
[EXTRA] Building MPFR
[EXTRA] Installing MPFR
[INFO ] Installing MPFR for host: done in 18.14s (at 01:05)
[INFO ] =================================================================
[INFO ] Installing ISL for host
[EXTRA] Configuring ISL
[EXTRA] Building ISL
[EXTRA] Installing ISL
[INFO ] Installing ISL for host: done in 29.02s (at 01:34)
[INFO ] =================================================================
[INFO ] Installing CLooG for host
[EXTRA] Configuring CLooG
[EXTRA] Building CLooG
[EXTRA] Installing CLooG
[INFO ] Installing CLooG for host: done in 6.93s (at 01:41)
[INFO ] =================================================================
[INFO ] Installing MPC for host
[EXTRA] Configuring MPC
[EXTRA] Building MPC
[EXTRA] Installing MPC
[INFO ] Installing MPC for host: done in 7.33s (at 01:48)
[INFO ] =================================================================
[INFO ] Installing binutils for host
[EXTRA] Configuring binutils
[EXTRA] Building binutils
[EXTRA] Installing binutils
[INFO ] Installing binutils for host: done in 60.53s (at 02:48)
[INFO ] =================================================================
[INFO ] Installing pass-1 core C compiler
[EXTRA] Configuring gcc
[EXTRA] Building gcc
[EXTRA] Installing gcc
[INFO ] Installing pass-1 core C compiler: done in 313.08s (at 08:02)
[INFO ] =================================================================
[INFO ] Installing kernel headers
[EXTRA] Installing kernel headers
[EXTRA] Checking installed headers
[INFO ] Installing kernel headers: done in 4.94s (at 08:06)
[INFO ] =================================================================
[INFO ] Installing C library headers & start files
[EXTRA] Configuring C library
[EXTRA] Installing C library headers
[EXTRA] Installing C library start files
[INFO ] Installing C library headers & start files: done in 15.00s (at 08:21)
[INFO ] =================================================================
[INFO ] Installing pass-2 core C compiler
[EXTRA] Configuring gcc
[EXTRA] Building gcc
[EXTRA] Installing gcc
[INFO ] Installing pass-2 core C compiler: done in 405.91s (at 15:07)
[INFO ] =================================================================
[INFO ] Installing C library
[EXTRA] Configuring C library
[EXTRA] Building C library
[EXTRA] Installing C library
[INFO ] Installing C library: done in 285.87s (at 19:53)
[INFO ] =================================================================
[INFO ] Installing final compiler
[EXTRA] Configuring gcc
[EXTRA] Building gcc
[EXTRA] Installing gcc
[INFO ] Installing final compiler: done in 482.19s (at 27:56)
[INFO ] =================================================================
[INFO ] Installing libelf for the target
[EXTRA] Configuring libelf
[EXTRA] Building libelf
[EXTRA] Installing libelf
[INFO ] Installing libelf for the target: done in 4.06s (at 28:00)
[INFO ] =================================================================
[INFO ] Installing dmalloc
[EXTRA] Configuring dmalloc
[EXTRA] Building dmalloc
[EXTRA] Installing dmalloc
[INFO ] Installing dmalloc: done in 5.82s (at 28:05)
[INFO ] =================================================================
[INFO ] Installing D.U.M.A.
[EXTRA] Copying sources
[EXTRA] Building libraries 'libduma.a libduma.so.0.0.0'
[EXTRA] Installing libraries 'libduma.a libduma.so.0.0.0'
[EXTRA] Installing shared library link
[EXTRA] Installing wrapper script
[INFO ] Installing D.U.M.A.: done in 2.30s (at 28:08)
[INFO ] =================================================================
[INFO ] Installing cross-gdb
[EXTRA] Configuring cross-gdb
[EXTRA] Building cross-gdb
[EXTRA] Installing cross-gdb
[EXTRA] Installing '.gdbinit' template
[INFO ] Installing cross-gdb: done in 119.94s (at 30:08)
[INFO ] =================================================================
[INFO ] Installing native gdb
[EXTRA] Building static target ncurses
[EXTRA] Building static target expat
[EXTRA] Configuring native gdb
[EXTRA] Building native gdb
[EXTRA] Installing native gdb
[INFO ] Installing native gdb: done in 155.79s (at 32:44)
[INFO ] =================================================================
[INFO ] Installing gdbserver
[EXTRA] Configuring gdbserver
[EXTRA] Building gdbserver
[EXTRA] Installing gdbserver
[INFO ] Installing gdbserver: done in 16.76s (at 33:00)
[INFO ] =================================================================
[INFO ] Installing ltrace
[EXTRA] Copying sources to build dir
[EXTRA] Configuring ltrace
[EXTRA] Building ltrace
[EXTRA] Installing ltrace
[INFO ] Installing ltrace: done in 15.95s (at 33:16)
[INFO ] =================================================================
[INFO ] Installing strace
[EXTRA] Configuring strace
[EXTRA] Building strace
[EXTRA] Installing strace
[INFO ] Installing strace: done in 12.44s (at 33:29)
[INFO ] =================================================================
[INFO ] Cleaning-up the toolchain's directory
[INFO ] Stripping all toolchain executables
[EXTRA] Installing the populate helper
[EXTRA] Installing a cross-ldd helper
[EXTRA] Creating toolchain aliases
[EXTRA] Removing access to the build system tools
[EXTRA] Removing installed documentation
[INFO ] Cleaning-up the toolchain's directory: done in 2.68s (at 33:31)
[INFO ] Build completed at 20170807.205300
[INFO ] (elapsed: 33:31.24)
[INFO ] Finishing installation (may take a few seconds)...
[33:31] /
mm@realtek:~/build$
mm@realtek:~/build$
8.看一下效果
mm@realtek:~/build$ ls -l /home/mm/toolchain
total 580K
dr-xr-xr-x 8 mm mm 4.0K 8月 7 20:53 ./
drwxr-xr-x 23 mm mm 4.0K 8月 7 23:31 ../
dr-xr-xr-x 6 mm mm 4.0K 8月 7 20:47 arm-jz2440-linux-gnueabi/
dr-xr-xr-x 2 mm mm 4.0K 8月 7 20:53 bin/
-r--r--r-- 1 mm mm 545K 8月 7 20:53 build.log.bz2
dr-xr-xr-x 3 mm mm 4.0K 8月 7 20:49 include/
dr-xr-xr-x 4 mm mm 4.0K 8月 7 20:49 lib/
dr-xr-xr-x 3 mm mm 4.0K 8月 7 20:47 libexec/
dr-xr-xr-x 4 mm mm 4.0K 8月 7 20:53 share/
mm@realtek:~/build$ cd /home/mm/toolchain/bin
mm@realtek:~/toolchain/bin$ ls
arm-jz2440-linux-gnueabi-addr2line arm-jz2440-linux-gnueabi-gcc arm-jz2440-linux-gnueabi-ldd
arm-jz2440-linux-gnueabi-ar arm-jz2440-linux-gnueabi-gcc-4.8.2 arm-jz2440-linux-gnueabi-nm
arm-jz2440-linux-gnueabi-as arm-jz2440-linux-gnueabi-gcc-ar arm-jz2440-linux-gnueabi-objcopy
arm-jz2440-linux-gnueabi-c++ arm-jz2440-linux-gnueabi-gcc-nm arm-jz2440-linux-gnueabi-objdump
arm-jz2440-linux-gnueabi-cc arm-jz2440-linux-gnueabi-gcc-ranlib arm-jz2440-linux-gnueabi-populate
arm-jz2440-linux-gnueabi-c++filt arm-jz2440-linux-gnueabi-gcov arm-jz2440-linux-gnueabi-ranlib
arm-jz2440-linux-gnueabi-cpp arm-jz2440-linux-gnueabi-gdb arm-jz2440-linux-gnueabi-readelf
arm-jz2440-linux-gnueabi-ct-ng.config arm-jz2440-linux-gnueabi-gprof arm-jz2440-linux-gnueabi-size
arm-jz2440-linux-gnueabi-elfedit arm-jz2440-linux-gnueabi-ld arm-jz2440-linux-gnueabi-strings
arm-jz2440-linux-gnueabi-g++ arm-jz2440-linux-gnueabi-ld.bfd arm-jz2440-linux-gnueabi-strip
mm@realtek:~/toolchain/bin$ ./arm-jz2440-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=./arm-jz2440-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/mm/toolchain/libexec/gcc/arm-jz2440-linux-gnueabi/4.8.2/lto-wrapper
Target: arm-jz2440-linux-gnueabi
Configured with: /work/.build/src/gcc-4.8.2/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_
unknown-linux-gnu --target=arm-jz2440-linux-gnueabi --prefix=/home/mm/toolchain --with-sysroot=/home/mm/toolchain/
arm-jz2440-linux-gnueabi/jz2440 --enable-languages=c,c++ --with-arch=armv4t --with-cpu=arm9tdmi --with-tune=arm920t
--with-float=soft --with-pkgversion='crosstool-NG 1.20.0' --with-bugurl=wheretogo0815@163.com --disable-sjlj-excep
tions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-
libquadmath-support --disable-libsanitizer --with-gmp=/work/.build/arm-jz2440-linux-gnueabi/buildtools --with-mpfr=
/work/.build/arm-jz2440-linux-gnueabi/buildtools --with-mpc=/work/.build/arm-jz2440-linux-gnueabi/buildtools --with-
isl=/work/.build/arm-jz2440-linux-gnueabi/buildtools --with-cloog=/work/.build/arm-jz2440-linux-gnueabi/buildtools
--with-libelf=/work/.build/arm-jz2440-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,
-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --enable-plugin --disable-nls --with-system-zlib
--disable-multilib --with-local-prefix=/home/mm/toolchain/arm-jz2440-linux-gnueabi/jz2440 --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.8.2 (crosstool-NG 1.20.0)
mm@realtek:~/toolchain/bin$
(完)
需要注意的问题:
编译时需要PC平台的一些软件支持,例如gawk,libexpat1-dev,但是在制作时我也并不知道需要安装哪些,因此我也就不总结需要安装什么了。等到编译出错时,看一下build.log就大致知道该安装什么,有问题,可以留言探讨。