c - 返回寄存器中的结构 - GCC 中的 ARM ABI

标签 c gcc struct arm

在 ARM ABI 文档中,我遇到了如下定义的函数:

__value_in_regs struct bar foo(int a, int b) {
    ...
}

但是 GCC(4.3.3) 不允许这样做,我所能找到的只是对某些 RealView 编译器的引用。 有没有办法从 GCC 做到这一点?

我已经尝试过 -freg-struct-return,但没有任何区别。由于它是一个 ABI,我无法更改原始程序,并且返回一个常规结构会破坏堆栈。

如果可以避免的话,我宁愿不为此使用程序集,因为它不是必需的。

谢谢!

最佳答案

根据要求作为答案发布:

如果您必须生成一个可与您的编译器不支持的 ABI 一起工作的二进制文件,那么您就有麻烦了。在 C 中您无能为力。在这种情况下,您将需要退回到汇编语言编程并进行必要的调用。有两种可能:

  1. 从您的二进制文件调用其他二进制文件的 ABI。
  2. 从其他二进制文件调用您的二进制文件的 ABI。

这两个问题的解决方法类似。要从您的代码中调用,您需要在程序集中创建填充函数,这些函数围绕调用约定进行调整以匹配外部 ABI,然后从那里调用外部函数。与您的 C 代码的不同之处在于,现在要进行外部调用,您调用内部汇编例程,它会执行它需要从外部调用的任何内容,然后将返回值以您的 C 代码可以理解的格式放回原处,然后返回.

要支持从外部二进制文件您的代码的调用,您需要做同样的事情,但要相反。您的二进制文件的入口点将是一些小的汇编例程,这些例程将外部 ABI 转换为您的 C 代码可以理解的格式,调用您的内部函数,然后将返回值放回外部代码可以理解的格式,然后返回。

恐怕有时没有好的解决方案。

关于c - 返回寄存器中的结构 - GCC 中的 ARM ABI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901488/

相关文章:

C中指针的比较

c++ - std::promise<void> 抛出未知错误,除非调用 sleep

在 C 中使用 typeof 创建一个特定的宏

c++ - SunCC 5.12 到 5.14 和 "Types cannot be declared in anonymous union"

C++ 继承结构

C++映射错误,有结构和方法,无法将字符串转换为_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<等

c - 此变量声明会造成内存问题

c - shell 如何处理重定向

c - pthread_self 返回不同的值

linux - 如何找到 GCC 支持的所有 EABI 版本以及如何找到目标系统的 EABI 版本?