ILD

使用crosstool-NG编译toolchain
作者:HerbertYuan 邮箱:yuanjp89@163.com
发布时间:2017-9-18 站点:Inside Linux Development

编译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


1 install 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


2 编译工具链

进入到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。


3 使用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_ascat 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_asecho $AS
/work/toolchain/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-as
herbert@herbert-pc:/work/code/arm_asecho $OBJDUMP
/work/toolchain/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-objdump

可以看到,能产生正确的arm指令。


后续,我将使用新的toolchain移植最新版本的uboot和内核到s3c2440。

Copyright © insidelinuxdev.net 2017-2021. Some Rights Reserved.