【问题标题】:Can I mix arm-eabi with arm-elf?我可以将 arm-eabi 与 arm-elf 混合使用吗?
【发布时间】:2012-05-13 08:50:14
【问题描述】:

我有一个产品,它使用生成“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 构建,如果它有什么不同的话......

【问题讨论】:

    标签: gcc embedded arm eabi


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我不限于 Windows,离开它的一个重要原因是我可以轻松获得一个可立即运行且闪亮的 Linux 新工具链,其中开发显然更容易。无论如何,我会尝试调用函数,我会尽快返回消息。谢谢。
    • 我应该注意,虽然我表示它可能会起作用,但我绝对不建议在真实系统中依赖这种行为。
    • 嘿@fljx - 有用吗?你已经有 4 年的时间来尝试这个了 :)
    【解决方案2】:

    始终可以选择在内联汇编中调用引导加载程序,在这种情况下,您可以遵守您需要的任何调用标准:)。

    但是,除了它引入的可移植性问题之外,这种方法还会对您的引导加载程序和应用程序做出两个假设:

    • 您可以在您的应用中检测到特定设备具有使用您的非 EABI 工具链构建的引导加载程序,因为您只能使用汇编代码调用旧类型的引导加载程序。
    • 您提到的两个参数被引导加载程序用作原始数据。例如,如果引导加载程序将它们用作结构的指针,那么您可能会面临对齐、填充等不正确的问题。

    【讨论】:

      【解决方案3】:

      认为这会好的。我自己进行了类似的迁移,据我所知,我只遇到了与处理除法有关的问题。

      This is the best info I can find about the differences,提示如果你没有结构对齐问题,你可能没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-04
        • 2011-12-23
        • 1970-01-01
        • 2017-03-24
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        相关资源
        最近更新 更多