arm-none-eabi和arm-linux-gnueabi之间的区别是什么?

21
arm-none-eabi和arm-linux-gnueabi有什么区别?我知道它们的使用方式不同(一个用于裸机软件,另一个用于在Linux上运行的软件),但是技术背景是什么?
我看到ABI有所区别,根据我理解,这类似于二进制级别的API。它确保了不同应用程序之间的互操作性。但是我不太明白有没有操作系统对我的工具链产生影响。唯一想到的是,在编译裸机软件时,库可能必须静态链接(是吗?),因为没有操作系统动态提供它们。
我找到的大多数与此主题相关的页面只回答了如何使用工具链而不是技术背景。我是机电一体化专业的学生,对嵌入式系统还比较陌生。

是的,这主要是一个库的问题,尝试针对在Linux上运行(libc等)进行调整,与我认为的newlib相比。 对于裸机工作,两者都可以,因为它们都可以从C生成汇编,并从汇编生成对象并使用自己的链接器脚本连接等。 我所说的裸机是指没有标准库和/或您使用此工具从源代码创建自己的库。 基本上,它们都作为通用交叉编译器工作,如果您想/需要内置库支持,则使用哪个可能很重要。 - old_timer
@dwelch:在裸机上没有必要使用任何库。你只需要可能提供一些函数(主要是memcpy等),gcc可能会调用它们(例如在分配structs时)。 - too honest for this site
@Olaf,我不在裸机上使用C库,但一些人会这样做,其中一些人使用newlib(或任何对该构建友好的库),其中一些人想使用arm-none-eabi而不是arm-linux-gnueabi,因为这对他们很重要。因此,这取决于OP的目标是什么,是否有差异很重要。 - old_timer
@dwelch:我强烈怀疑arm-linux-gnueabi适用于裸机系统。虽然从未尝试过。首先,如果我没记错的话,arm-none-*默认是一个自由实现,因此它不依赖于C标准库(用于托管系统),并且gcc不会为某些标准库函数使用其内置的优化。 - too honest for this site
1
@Olaf,我的大部分工作和个人裸机代码都可以使用任何一种变体,因为我不依赖于除了能够从C生成汇编语言的编译器和能够从汇编语言生成机器码的汇编器以及只链接我提供的内容的链接器之外的任何东西。但是它非常依赖于用户及其代码和构建系统。更容易被 -linux- 版本绊倒。是的,gcc库的东西很快就会变得与系统相关,所以我也控制这些东西。 - old_timer
@dwelch:对我来说也是一样。这样我就必须在自己的部分中搜索问题,而不是一些第三方库。正如我所写的,我从未尝试过,也从未研究过它们之间的区别。也许这个问题并不那么糟糕。我没有谈论libgcc,而是C标准库的实现,例如newlib或glibc。libgcc很难避免,但当然,您可以在自己的库中实现其功能(虽然我认为这没有太多意义,因为它没有外部依赖项且是特定于目标的)。 - too honest for this site
1个回答

13

或许这个链接中的描述可以帮助你。

最大的区别可能是:

"裸机ABI会假设不同的C库(例如Newlib,甚至没有C库),而Linux ABI则假设glibc。 因此,编译器可能会根据其认为可用的标准C库之上和之外的内容进行不同的函数调用。"


6
网络中断了!:( :( - hEShaN
@hEShaN 试一下这个 - akhan

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