arm-eabi、arm-gnueabi和gnueabi-hf编译器之间的区别是什么?

71
什么是arm-eabi、gnueabi和gnueabi-hf交叉编译器之间的区别?
1个回答

65

我不是完全确定:

  • eabi代表编译将在裸机arm内核上运行的代码。
  • gnueabi代表为Linux编译代码。

关于gnueabi/gnueabi-hf,我在这里找到了答案。

gcc-arm-linux-gnueabi是用于armel架构的交叉工具链包。此工具链使用由gcc的-mfloat-abi=soft或-mfloat-abi=softfp选项生成的EABI。

gcc-arm-linux-gnueabihf是用于armhf架构的交叉工具链包。此工具链使用由gcc的-mfloat-abi=hard选项生成的EABI。

'hf'表示硬件浮点,这表明编译器及其底层库正在使用硬件浮点指令,而不是浮点软件实现,如定点软件实现。 'eabi'指的是底层二进制文件的样子。 可以通过gcc的标志来实现它们,但问题在于裸机预编译库。除非您从源代码重新编译所有内容,否则仅使用标志可能不可行。即使在这种情况下,您也可能需要仔细配置每个包或库的适当编译选项。


11
参见:https://wiki.linaro.org/WorkingGroups/ToolChain/FAQ#What_is_the_differences_between_.2BIBw-arm-none-eabi-.2BIB0_and_.2BIBw-arm-linux-gnueabihf.2BIB0.3F_Can_I_use_.2BIBw-arm-linux-gnueabihf.2BIB0_tool_chain_in_bare-metal_environment.3F_How_do_you_know_which_toolchain_binary_to_use_where.3F裸机 ABI(eabi)将假设不同的C库(例如newlib,甚至没有C库),而Linux ABI (gnueabi)则假定glibc。因此,编译器可能会根据它认为在标准C库之上可用的内容而进行不同的函数调用。 - Lekensteyn
2
虽然我看到你从外部源中提取了这个,但是在这里使用“architecture”是误导性的。armelarmhf之间的区别基本上是编译器生成的软件浮点和硬件浮点EABI之间的区别。 - sherrellbc
4
引文中使用的“architecture”除外,措辞很好。我提到这是误导性的,只是因为没有“armel architecture”——它将永远是针对ARM体系结构的编译器。根据编译时给定的参数,编译器将使用特定的EABI用于在这种体系结构上使用。如您的评论所述,gcc被指示使用软浮点机制,而不是支持硬件浮点机制(如果没有FPU,则必须这样做)。值得注意的另一个选项是“armeb”,它是使用大端序的“armel”。 - sherrellbc
3
还有一个问题,为什么有两个工具链(-gnueabi-gnueabihf)。为什么不只有一个工具链来理解-mfloat-abi=soft/hard/softfp选项(就像本地的arm linux gcc一样)? - Anton Ostrouhhov
6
我能明白您的要求。@AntonOstrouhhov,我找到答案了!“工具链”不仅是编译器,还包括binutils和已编译的库(libc)等。=> 2个工具链:一个包括使用软件ABI的库,另一个则使用硬件ABI :) - Anton Ostrouhhov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接