简介

我们编译程序的时候,经常因为目标操作系统资源不足够,不能直接在目标板上面编译程序。因此这个时候需要交叉编译。用的最多的就是arm-xxx-xxx-gcc系列的工具链了。可是gcc系列的工具链这么多,为什么要选择这一个工具,这些工具的命名规则又是什么了?
一个编译工具链需要包含 binutils 以及 glibc(也有可能是newlibc)。我们平常所说的gcc,里面就包含 binutils 一套工具的简称。

binutils


binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。

glibc

C运行库 C 函数库 (libc,glibc,uClibc,newlib)

命名规则

  1. Tool chains have a loose name convention like arch [-vendor] [-os] - eabi
  2. arch - refers to target architecture (which in our case is ARM)
  3. vendor - refers to toolchain supplier
  4. os - refers to the target operating system
  5. eabi - refers to Embedded Application Binary Interface
  6. # arch [-vendor] [-os] [-(gnu)eabi] [-gcc]
  7. # arm-fsl-linux-gnueabi-gcc
  8. arch = arm
  9. vendor = fsl
  10. os = linux
  11. eabi = gnueabi

eabi

Embedded Application Binary Interface 嵌入式应用二进制接口,
Application Binary Interface 应用二进制接口
请参考 https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi 文章。**

os

1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。
2、arm-none-linux-gnueabi-gcc
(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx 交叉编译工具的浮点运算非常优秀。一般ARM9、ARM11、Cortex-A 内核,带有 Linux 操作系统的会用到。

armel 与 armhf

ARM hard float 和 ARM EABI Little-endian。 由于arm架构的问题,使用的armel处理浮点问题,后期改进了架构,可以使用硬件浮点了。因此在这里就出现了两种

arm-linux-gnueabi-gcc arm-linux-gnueabihf-gcc

两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构

参考资料

  1. arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
  2. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
  3. arm交叉编译器区别
  4. What’s the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?
  5. What are the purposes of the ARM ABI and EABI?
  6. C 函数库 (libc,glibc,uClibc,newlib)