gcc - 我可以将 arm-eabi 与 arm-elf 混合使用吗?

标签 gcc embedded arm eabi

我有一个产品,它使用生成“arm-elf”的编译器(gnuarm GCC 4.1.1)编译引导加载程序和应用程序。

引导加载程序和应用程序在链接描述文件中被隔离在不同的 FLASH 存储区中。

该应用程序具有一项功能,可以调用引导加载程序(作为具有 2 个参数的简单 c 函数)。

我需要能够升级世界各地的现有产品,并且我可以使用始终使用相同的编译器安全地做到这一点。

现在我希望能够使用输出 arm-eabi 的新 GCC 版本来编译这个产品应用程序。

对于新产品来说一切都很好,其中应用程序和引导加载程序都是使用相同的工具链编译的,但是现有产品会发生什么?
如果我刷新一个使用 GCC 4.6.x 和 arm-none-eabi 编译的新应用程序,我的应用程序是否仍然能够从旧的 arm-elf 引导加载程序调用引导加载程序函数?

此外,与上述问题没有直接关系,我可以将使用 arm-elf 编译的目标文件混合到使用 arm-eabi 编译的二进制文件中吗?

编辑:

我认为很清楚我正在为裸机 ARM7 构建,如果它有什么不同的话......

最佳答案

不,ABI 是使二进制文件兼容的魔法。应用程序二进制接口(interface)决定了如何与其他库/应用程序通信的各种约定。例如,ABI 将定义调用约定,它会隐含假设哪些寄存器用于将参数传递给 C 函数,以及如何处理多余的参数。

我不知道 EABI 和 ABI 之间的确切区别,但您可以通过阅读 EABI 找到其中的一些。 Debian's page提到系统调用约定是不同的,以及一些对齐更改。

鉴于上述情况,当然,您不能混合 arm-elf 和 arm-eabi 对象。

上面的答案是在您与主应用程序中的引导加载程序代码对话的假设下给出的。鉴于接口(interface)可能非常简单(只是一个带有两个参数的函数调用),它可能会起作用。这将是一个有趣的尝试。但是,不能**保证**工作。

请记住,您不必使用 EABI。您可以使用 gcc 4.6 以及旧版本生成 arm-elf 工具链。由于您在 Windows 上使用二进制工具链,因此您可能面临更多挑战。我建议调查 crosstool-ng ,这在 Linux 上运行良好,并且在 cygwin 上可以正常运行以构建适当的工具链。

关于gcc - 我可以将 arm-eabi 与 arm-elf 混合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438158/

相关文章:

c++ - clang 或 gcc 是否利用引用限制进行别名分析

embedded - 嵌入式代码示例的用例图

rust - 使用 STM32f1xx_hal crate 时借用移动值错误

linux-kernel - 适用于 ARM 处理器的 Linux 内核 3.9 KVM

linux - 如何在 Linux 启动期间尽早设置 i2c PCA9570 gpio 扩展器的值?

assembly - 混淆的 AES 解密程序集

c++ - 如何使用 C++11 标准使 g++ 永久编译?

c - perror() 给出段。过错

c++ - Boost 1.64 在 solaris 上构建错误

java - 使用 Java ME Embedded 8 访问 beaglebone black 上的 GPIO