在 ARM ABI 文档中,我遇到了如下定义的函数:
__value_in_regs struct bar foo(int a, int b) {
...
}
但是 GCC(4.3.3) 不允许这样做,我所能找到的只是对某些 RealView 编译器的引用。 有没有办法从 GCC 做到这一点?
我已经尝试过 -freg-struct-return,但没有任何区别。由于它是一个 ABI,我无法更改原始程序,并且返回一个常规结构会破坏堆栈。
如果可以避免的话,我宁愿不为此使用程序集,因为它不是必需的。
谢谢!
最佳答案
根据要求作为答案发布:
如果您必须生成一个可与您的编译器不支持的 ABI 一起工作的二进制文件,那么您就有麻烦了。在 C 中您无能为力。在这种情况下,您将需要退回到汇编语言编程并进行必要的调用。有两种可能:
- 从您的二进制文件调用其他二进制文件的 ABI。
- 从其他二进制文件调用您的二进制文件的 ABI。
这两个问题的解决方法类似。要从您的代码中调用,您需要在程序集中创建填充函数,这些函数围绕调用约定进行调整以匹配外部 ABI,然后从那里调用外部函数。与您的 C 代码的不同之处在于,现在要进行外部调用,您调用内部汇编例程,它会执行它需要从外部调用的任何内容,然后将返回值以您的 C 代码可以理解的格式放回原处,然后返回.
要支持从外部二进制文件到您的代码的调用,您需要做同样的事情,但要相反。您的二进制文件的入口点将是一些小的汇编例程,这些例程将外部 ABI 转换为您的 C 代码可以理解的格式,调用您的内部函数,然后将返回值放回外部代码可以理解的格式,然后返回。
恐怕有时没有好的解决方案。
关于c - 返回寄存器中的结构 - GCC 中的 ARM ABI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901488/