Gcc 我可以将手臂eabi与手臂elf混合使用吗?

Gcc 我可以将手臂eabi与手臂elf混合使用吗?,gcc,embedded,arm,eabi,Gcc,Embedded,Arm,Eabi,我有一个产品,它使用生成“arm elf”的编译器(gnuarm GCC 4.1.1)编译引导加载程序和应用程序 引导加载程序和应用程序在链接器脚本的不同闪存区域中分离 应用程序有一个特性,可以调用引导加载程序(作为一个带有2个参数的简单c函数) 我需要能够升级世界各地的现有产品,我可以安全地使用相同的编译器来完成这项工作 现在,我希望能够使用输出arm eabi的新GCC版本编译此产品应用程序 对于新产品来说一切都会很好,应用程序和引导加载程序都是使用相同的工具链编译的,但是现有产品会发生什么

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

引导加载程序和应用程序在链接器脚本的不同闪存区域中分离

应用程序有一个特性,可以调用引导加载程序(作为一个带有2个参数的简单c函数)

我需要能够升级世界各地的现有产品,我可以安全地使用相同的编译器来完成这项工作

现在,我希望能够使用输出arm eabi的新GCC版本编译此产品应用程序

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


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


编辑:


我想很好地说明我正在为一个裸机ARM7构建,如果它有什么不同的话…

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

我不知道EABI和ABI之间的确切区别,但是你可以通过阅读EABI找到其中的一些区别。提到系统调用约定不同,还有一些对齐方式的更改

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

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


请记住,您不必使用EABI。您可以使用GCC4.6生成arm elf工具链,就像使用旧版本一样。由于您在windows上使用的是二进制工具链,因此您可能面临更大的挑战。我建议进行调查,这在Linux上运行得很好,在cygwin上也可以运行,以构建适当的工具链。

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

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

  • 您可以在应用程序中检测到特定设备具有使用非EABI工具链构建的引导加载程序,因为您只能使用汇编代码调用旧类型的引导加载程序
  • 您提到的两个参数被引导加载程序用作基本数据。例如,如果引导加载程序使用它们作为指向结构的指针,那么您可能会面临对齐、填充等不正确的问题
我想这样就可以了。我自己也做过类似的迁移,从我记忆中我只遇到了处理部门的问题


,这表明,如果没有结构对齐问题,您可能会没事。

我并不局限于Windows,离开它的一个重要原因是我可以很容易地为Linux获得一个准备好运行的全新工具链,Linux的开发显然更容易。无论如何,我会尝试函数调用,我会尽快带着消息回来。谢谢。我应该注意,虽然我指出它可能会起作用,但我绝对不建议在实际系统中依赖这种行为。嘿@fljx-它起作用了吗?您已经有4年的时间来尝试这一点:)