在ARM ABI文档中,我遇到了以下定义的函数:
__value_in_regs struct bar foo(int a, int b) {
...
}
Run Code Online (Sandbox Code Playgroud)
但GCC(4.3.3)不允许它,我所能找到的只是对一些RealView编译器的引用.从GCC有没有办法做到这一点?
我已经尝试过-freg-struct-return但它并没有什么区别.因为它是一个ABI我无法改变原始程序,并返回一个常规结构破坏堆栈.
如果可以避免的话,我宁愿不使用汇编,因为它不是必需的.
谢谢!
根据要求发布答案:
如果你必须生成一个可以与编译器不支持的ABI一起使用的二进制文件,那么你就会遇到麻烦.在C中没有什么可以做的.在这种情况下,你需要依靠汇编语言编程并打乱必要的调用.有两种可能性:
这两个问题都是类似的.要从代码中调用,您需要在汇编中调用shim函数,调用约束来调用外部ABI,然后从那里调用外部函数.与C代码的不同之处在于,现在要进行外部调用,调用内部汇编例程,并执行外部调用所需的任何操作,然后将返回值放回C代码将理解的格式中,并返回.
要支持从外部二进制文件到代码的调用,您可以执行相同的操作,但反之亦然.二进制文件的入口点是小程序集例程,它们将外部ABI转换为C代码可以理解的格式,调用内部函数,然后将返回值恢复为外部代码理解的格式,然后返回.
我害怕,有时候没有好的解决方案.