arm系列交叉编译器各版本区别

交叉编译器命名规则

交叉编译器的命名规则:arch [-vendor] [-os] [-(gnu)eabi] [-language]

  • arch - 体系架构, 如arm(ARM-32bit)、aarch64(ARM-64bit)、x86等;
  • vendor -工具链提供商,经常省略,或用 none 替代;
  • os - 目标操作系统, 如linux,没针对具体 os 则 用 none 替代。同时没有 vendor 和os 使用一个 none 替代。
  • eabi - 嵌入式应用二进制接口(Embedded Application binary Interface)
  • language - 编译语言,如gcc,g++

具体编译器举例

crosstool-ng交叉编译工具样本

制作交叉编译工具链的 crosstool-ng 官网上就列出很多交叉编译工具样本,都是按以上命名规则命名的。

aarch64-ol7u9-linux-gnu
aarch64-ol8u6-linux-gnu
aarch64-ol8u7-linux-gnu
aarch64-rpi3-linux-gnu
aarch64-rpi4-linux-gnu
aarch64-unknown-linux-gnu
aarch64-unknown-linux-uclibc
arm-bare_newlib_cortex_m3_nommu-eabi
arm-cortex_a15-linux-gnueabihf
arm-cortexa5-linux-uclibcgnueabihf
arm-cortex_a8-linux-gnueabi
arm-cortexa9_neon-linux-gnueabihf
arm-multilib-linux-uclibcgnueabi
arm-nano-eabi
arm-none-eabi
arm-ol7u9-linux-gnueabi
arm-ol7u9-linux-gnueabihf
arm-picolibc-eabi
arm-unknown-eabi
arm-unknown-linux-gnueabi
arm-unknown-linux-musleabi
arm-unknown-linux-uclibcgnueabi
arm-unknown-linux-uclibcgnueabihf
x86_64-centos7-linux-gnu
x86_64-multilib-linux-gnu
x86_64-multilib-linux-musl
x86_64-multilib-linux-uclibc
x86_64-multilib-linux-uclibc,moxie-unknown-moxiebox
x86_64-multilib-linux-uclibc,powerpc-unknown-elf
x86_64-ol8u6-linux-gnu
x86_64-ol8u7-linux-gnu
x86_64-pc-linux-gnu,arm-picolibc-eabi
x86_64-ubuntu14.04-linux-gnu
x86_64-ubuntu16.04-linux-gnu
x86_64-unknown-linux-gnu
x86_64-unknown-linux-uclibc
x86_64-w64-mingw32
x86_64-w64-mingw32,arm-cortexa9_neon-linux-gnueabihf
x86_64-w64-mingw32,x86_64-pc-linux-gnu

arm交叉编译器举例

  • arm-none-eabi-gcc

ARM architecture,no vendor,not target an operating system,complies with the ARM EABI(ARM 程序接口)

用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),一般用于ARM MCU系列芯片,如 ARM7、Cortex-M 和 Cortex-R ,没有操作系统,不支持那些跟操作系统关系密切的函数,它使用的是newlib 这个专用于嵌入式系统的C库,安装方法:

sudo apt-get install gcc-arm-none-eabi
  • arm-linux-gnueabi-gcc

ARM architecture, creates binaries that run on the Linux operating system, and uses the GNU EABI (GUN 程序接口)

也叫 arm-none-linux-gnueabi-gcc,因为一开始是没有发行商的,目前由Linaro 公司发行,一般用于 ARM9、ARM11、Arm Cortex-A 系列芯片,带有 Linux 操作系统。前者针对 32 位芯片,后者针对 64 位芯片,使用的是glibc库。可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序,安装方法:

sudo apt-get install gcc-arm-linux-gnueabi
  • arm-linux-gnueabihf-gcc

和 arm-linux-gnueabi-gcc 区别不过是 gcc 的选项 -mfloat-abi 的默认值不同,即浮点数处理上的不同,详见后文解答。
• aarch64-none-linux-gnu-gcc

是arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc的ARM-64bit版本。

  • arm-eabi-gcc

Android ARM 编译器。

  • arm-none-uclinuxeabi-gcc

用于uCLinux,使用glibc。

  • arm-none-symbianelf-gcc

用于symbian。

几个概念

ABI与EABI

ABI:二进制应用程序接口(Application Binary Interface)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口;

EABI:即嵌入式ABI,应用于嵌入式系统的二进制应用程序接口(Embeded Application Binary Interface)。

两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。

gnueabi与gnueabihf

gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture

这两个交叉编译器适用于armel和armhf两个不同的架构,armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)。

其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同。gcc的选项-mfloat-abi有三种值soft、softfp、hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):

soft:不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。

softfp:armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。

hard:armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

参考

猜你喜欢

转载自blog.csdn.net/benkaoya/article/details/129542585