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

Posted

技术标签:

【中文标题】arm-none-eabi 和 arm-linux-gnueabi 之间的区别?【英文标题】:Difference between arm-none-eabi and arm-linux-gnueabi? 【发布时间】:2016-12-21 18:04:36 【问题描述】:

arm-none-eabi 和 arm-linux-gnueabi 有什么区别?我知道如何使用它们的区别(一种用于裸机软件,另一种用于在 linux 上运行的软件)。但是技术背景是什么?

我发现 ABI 有所不同,据我了解,它类似于 API,但在二进制级别。它确保了不同应用程序的互操作性。

但我真的不明白拥有或不拥有操作系统会以何种方式影响我的工具链。我唯一想到的是,在编译裸机软件时库可能必须静态链接(是吗?),因为没有操作系统动态提供它们。

我发现与该主题相关的大多数页面只是回答了如何使用工具链,而不是技术背景。我是机电一体化专业的学生,​​刚接触嵌入式系统,所以我在这个领域的经验有些有限。

【问题讨论】:

是的,它主要是一个库的东西,试图调整在 linux(libc 等)上运行,而我认为是 newlib。对于裸机工作,两者都可以,因为它们既可以从 C 进行程序集,也可以从程序集创建对象并与您自己的链接器脚本链接等。我正在谈论的裸机是没有标准库的裸机和/或您使用它从源代码创建您自己的库的工具。基本上它们都作为通用交叉编译器工作,如果你想要/需要内置库支持,那么你使用哪一个可能很重要。 @dwelch:没有必要在裸机上使用任何库。您只需可能必须提供一些函数(主要是 memcpy 等)gcc 可能会调用(例如,在分配 structs 时)。 @Olaf 我不在裸机上使用 C 库,但有些人会使用,其中一些人使用 newlib(或任何对该构建友好的东西),而其中一些人想使用 arm-none -eabi 而不是 arm-linux-gnueabi 因为这对他们很重要。因此,差异是否重要取决于 OP 的目标。 @dwelch:我强烈怀疑 arm-linux-gnueabi 是否适用于裸机系统。不过,从未尝试过。例如,iirc,arm-none-* 默认情况下是一个独立的实现,因此它不依赖于托管系统的 C 标准库,并且 gcc 不使用其对某些标准库函数的内置优化。 @Olaf 我的大部分工作和个人裸机代码都可以使用任何一种变体,因为除了可以从 C 生成 asm 的编译器和可以从 asm 生成机器代码的汇编器之外,我不依赖任何变体,以及一个只链接我提供的东西的链接器。尽管它非常依赖于用户及其代码和构建系统。更有可能被 -linux- 绊倒。是的,gcc lib 的东西可以很快地依赖于系统,所以我也可以控制它们。 【参考方案1】:

也许这个link 的描述会有所帮助。

可能最大的不同:

“裸机 ABI 将假定与 Linux ABI(假定为 glibc)不同的 C 库(例如 newlib,甚至没有 C 库)。因此,编译器可能会根据它的信念进行不同的函数调用在标准 C 库之外可用。”

【讨论】:

链接断开! :( :( @hEShan 试试this

以上是关于arm-none-eabi 和 arm-linux-gnueabi 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

arm gcc 工具链作为 arm-elf 或 arm-none-eabi,有啥区别?

ARM-NONE-EABI链接链中对memcpy的未定义引用

arm-none-eabi 全局初始化变量值不正确

g++ arm-none-eabi 从 4.9 升级到 gcc 8.2。生成的二进制文件不再适合闪存

ARM-Linux开发与MCU开发有何不同?下篇

ARM-Linux开发weston配置使用和介绍