编译toolchain是一件复杂的事情。toolchain包括binutils, gcc, glibc 3个部分。如果手动编译的话,对一个新手来说恐怕是一个噩梦,我之前也经历过这个痛苦。如果你了解的话,有专门的工具可以做这个事情,那就是crosstool-NG。
croostool-NG的前身是crosstool,原作者Dan Kegel把crosstool贡献给社区,Yann E. Morin后来创建了crosstool-NG,14年Bryan Hundven被选为维护者。crosstool-NG的官方网站和git仓库:
http://crosstool-ng.github.io/
https://github.com/crosstool-ng/crosstool-ng
首先下载源码:
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.xz
解压后,执行下述命令安装:
1 2 3 | ./configure --prefix=/work/install/ct-ng-1.23.0 make make install |
进入到ct-ng安装目录的bin子目录,唯一的一个命令为ct-ng,可先查看帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | herbert@herbert-pc: /work/install/ct-ng-1 .23.0 /bin $ . /ct-ng help This is crosstool-NG version crosstool-ng-1.23.0 Copyright (C) 2008 Yann E. MORIN <yann.morin.1998@ free .fr> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below for a list of available actions, listed by category: Configuration actions: menuconfig - Update current config using a menu based program nconfig - Update current config using a menu based program oldconfig - Update current config using a provided .config as base extractconfig - Extract to stdout the configuration items from a ... |
查看模板配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | herbert@herbert-pc: /work/install/ct-ng-1 .23.0 /bin $ . /ct-ng list-samples Status Sample name IN config.gen /arch . in IN config.gen /kernel . in IN config.gen /cc . in IN config.gen /binutils . in IN config.gen /libc . in IN config.gen /debug . in [G..] aarch64-rpi3-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..] arm-nano-eabi [G..] arm-unknown-eabi [G..] arm-unknown-linux-gnueabi 。。。 |
我们选择arm-unknown-linux-gnueabi。我们选择arm目标,linux-gnueabi接口,eabi的知识请查看之前文章
http://insidelinuxdev.net/article/a01qij.html
根据help,直接执行:
1 | . /ct-ng arm-unknown-linux-gnueabi |
会在当前目录生成.config文件。然后执行
1 | . /ct-ng menuconfig |
进行配置,
进入paths
我这里配置了两项,Local tarballs directory配置为/work/tar,这个是各种tar源码包的存放路径。你可以手动下载gcc等源码包,放在该目录,如果没有相关源码包,ct-ng会自己去下。推荐手动下载。
Prefix directory是toolchain的安装目录,配置为/work/toolchain/${CT_TARGET},变量CT_TARGET的值就是arm-unknown-linux-gnueabi。
进入targets配置:
这是最重要的配置内容了,和目标相关。Emit assembly for cpu配置为arm920t,你应该根据你的板子选择正确的cpu。gcc会根据这个选项得到arch和cpu,如果不配置这个选项,也可以直接指定架构和CPU。
对于s3c2440,arch为armv4t,tune为arm920t。和架构相关的选项可以查看gcc和arm相关的选项,得到架构和cpu列表。
fpu的配置也和cpu硬件相关,2440没有fpu,所以Floating point配置为software。
toolchain选项没啥好配的,进入Operating system选项:
主要是选择内核的版本,可以选择已有的,亦可以选择custom,这里选择已有的4.4.59
后续的选择,没啥难度,看情况选择即可,主要是各种包的版本的选择。配置好后保持退出。
执行下列命令,编译:
1 | . /ct-ng build |
经过18分钟(取决你的电脑的配置,我的电脑为i5加固态硬盘,所以这个速度算比较快。之前使用虚拟机,需要1个多小时)的编译之后,在之前配置的prefix目录,将看到安装好的toolchain。
由于s3c2440开发板当前的系统是使用老的abi工具链编译的,所以新的linux-gnueabi编译的程序无法使用,没有操作系统的支持,现在还只能进行简单的验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | herbert@herbert-pc: /work/code/arm_as $ cat mov.S .text MOV r1, #256 LDR r0, =11111 herbert@herbert-pc: /work/code/arm_as $ $AS mov.S -o mov.o herbert@herbert-pc: /work/code/arm_as $ herbert@herbert-pc: /work/code/arm_as $ $OBJDUMP -d mov.o mov.o: file format elf32-littlearm Disassembly of section .text: 00000000 <.text>: 0: e3a01c01 mov r1, #256 ; 0x100 4: e51f0004 ldr r0, [pc, #-4] ; 8 <.text+0x8> 8: 00002b67 .word 0x00002b67 herbert@herbert-pc: /work/code/arm_as $ echo $AS /work/toolchain/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-as herbert@herbert-pc: /work/code/arm_as $ echo $OBJDUMP /work/toolchain/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-objdump |
可以看到,能产生正确的arm指令。
后续,我将使用新的toolchain移植最新版本的uboot和内核到s3c2440。