嵌入式开发之交叉编译工具链制作

文章目录

  • 嵌入式开发之交叉编译工具链制作
    • 1. 为什么需要交叉编译工具链?
    • 2. 一定要自己制作吗?
    • 3. 交叉编译工具链命名解释
    • 4. 交叉编译工具链制作实战
      • 4.1 下载crosstool-ng源码,进行安装
      • 4.2 `ct-ng list-samples`
      • 4.3 `ct-ng arm-cortex_a8-linux-gnueabi`
      • 4.4 `ct-ng menuconfig`
        • 4.4.1 Paths and misc options
        • 4.4.2 Target options
        • 4.4.3 Toolchain options
        • 4.4.4 Operating system
        • 4.4.5 C compiler
      • 4.5 `ct-ng build`
    • 5.成果物

嵌入式开发之交叉编译工具链制作

1. 为什么需要交叉编译工具链?

pclinux发行版都自带gnu工具,包括gcc/g++等,其编译出来的应用程序只能运行在pc平台上,如果需要编译针对嵌入式平台的应用程序,则需要嵌入式平台操作系统提供的gnu工具,一般嵌入式linux系统都是裁减过的,系统不会有gcc/g++,就算有,用其编译大型软件也不现实,可以想象速度之慢,
因此,我们需要制作符合目标平台的交叉编译工具链,该工具链运行在PC平台上,用其编译出来的应用程序运行于对应目标平台上,交叉由此而来。

2. 一定要自己制作吗?

可以使用网上他人制作好的一些通用的交叉编译工具链,但由于其不是特定于某一平台,因此编译出来的程序不是最优的,性能可能会打折扣,也可能会出现一些兼容性问题,因此建议针对特定平台制作符合目标平台的交叉编译工具链。
比如常见的codesourcery公司基于GCC推出的的ARM交叉编译工具:
arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

3. 交叉编译工具链命名解释

arch [-vendor] [-os] [-(gnu)eabi]

arch - 架构,比如arm
vendor - 工具链提供商,比如none
os - 目标平台操作系统,比如linux
eabi - 嵌入式应用二进制接口

  • 比如rm-none-linux-gnueabi-gcc 主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery公司优化过推出的编译器。arm-none-linux-gnueabi-xxx交叉编译工具的浮点运算非常优秀,一般ARM9、ARM11、Cortex-A 内核,带有 Linux操作系统的会用到,见上文。
  • 另外这里说明下arm-linux-gnueabi-gccarm-linux-gnueabihf-gcc的区别,两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,只是armel 和 armhf 这两种架构在对待浮点运算采取不同的策略。带hf(hard模式)说明使用fpu计算,同时传参也用fpu中的浮点寄存器,性能最好,不带hf说明要么用fpu计算,但传参用普通寄存器(softfp模式),或者不用fpu,软件模式(soft模式)。

4. 交叉编译工具链制作实战

编译环境:
centos7, gcc/g++4.8.5
目标平台:
Hardware : Freescale i.MX6 Ultralite (Device Tree)
model name : ARMv7 Processor rev 5 (v7l)

4.1 下载crosstool-ng源码,进行安装

解压、configure、make、make install
成果物:ct-ng

4.2 ct-ng list-samples

选择最接近的配置模板,比如我的是A7平台,选择了最接近的arm-cortex_a8-linux-gnueabi,如下图:
嵌入式开发之交叉编译工具链制作_第1张图片

4.3 ct-ng arm-cortex_a8-linux-gnueabi

会在当前工作目录生成默认.config配置文件

4.4 ct-ng menuconfig

使用menuconfig进行图形化配置选择,就像裁减内核一样

4.4.1 Paths and misc options

嵌入式开发之交叉编译工具链制作_第2张图片
嵌入式开发之交叉编译工具链制作_第3张图片

4.4.2 Target options

嵌入式开发之交叉编译工具链制作_第4张图片

4.4.3 Toolchain options

嵌入式开发之交叉编译工具链制作_第5张图片

4.4.4 Operating system

目标系统Linux的内核为4.1.15,此处选择的内核不大于4.1.15
嵌入式开发之交叉编译工具链制作_第6张图片

4.4.5 C compiler

考虑到稳定性,选择稍微低一点版本的gcc
嵌入式开发之交叉编译工具链制作_第7张图片

4.5 ct-ng build

执行命令ct-ng build, 会开始下载一些源码包到目录/home/sam/src,比如linux内核,gnu工具等,如果在公司内网可能无法下成功(速度过慢或者网站被过滤了),这个时候就需要发挥自己网络上寻找资源的能力了,手动下载tarball(源码包)到/home/sam/src目录,最终会用到的源码资源如下:
嵌入式开发之交叉编译工具链制作_第8张图片
libelf-0.8.13.tar.gz
https://fossies.org/linux/misc/old/libelf-0.8.13.tar.gz
另外可以查看.config配置文件中给出的资源下载路径,上面的libelf就是这样找到的。
接下来就是漫长时间的等待,我自己build时长如下(2个多小时):嵌入式开发之交叉编译工具链制作_第9张图片

5.成果物

c++5.5.0源码,编译工具等
嵌入式开发之交叉编译工具链制作_第10张图片
嵌入式开发之交叉编译工具链制作_第11张图片

你可能感兴趣的:(linux,嵌入式,linux,交叉编译,arm)