1
5
按请求作为答复发布: 如果必须生成一个与编译器不支持的ABI一起工作的二进制文件,那么就有麻烦了。在C语言中你什么都做不了。在这种情况下,你需要回到汇编语言编程上,然后对必要的调用进行thunk。有两种可能性:
这两个问题都得到了类似的解决。要从代码中调用,您需要使程序集中的填充函数围绕调用约定旋转以匹配外部ABI,然后从那里调用外部函数。与C代码不同的是,现在要进行外部调用,需要调用内部程序集例程,并且它执行外部调用所需的任何操作,然后将返回值放回C代码能够理解的格式,然后返回。 支持外部二进制文件的调用 进入之内 你的代码,你做了同样的事情,但是反过来。您的二进制文件的入口点是一些小的汇编例程,它们将外部ABI转换成C代码可以理解的格式,调用内部函数,然后将返回值转换成外部代码可以理解的格式,然后返回。 恐怕有时候没有好的解决办法。 |
2
2
您可以使用“long long”对两个寄存器执行此操作,如本页“ARM架构的过程调用标准”链接中所述。
将简单地编译为:
以及
甚至可以使用“集装箱化”对寄存器r0到r3执行此操作。 向量“:
编译为:
注意,在上面的文档中,它被引用为simd/neon特性,但是我只是在一个皮质m0上以拇指模式实现了它,没有neon支持。 |
3
0
这个 "Procedure Call Standard for the ARM Architecture" 具体来说(第5.4节:结果返回): “r0中返回的复合类型不超过4个字节。” “大于4字节的复合类型…存储在内存中,地址在调用函数时作为额外参数传递…." 我知道有些CPU有几个不同的“标准”ABI。 但我的印象是几乎所有ARM的编译器都使用相同的ABI。 你有证据证明GCC 不 使用此标准ABI? 您是否介意发布一个链接,指向ARM的ABI上与此标准ABI(呼叫者使用的ABI)或被呼叫者使用的ABI或两者都不同的任何信息? |
4
-1
我不确定这是否有效,但您可以尝试使用
|
Darky · 多重定义…c++vsCode[重复] 2 年前 |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
Noè Murr · 如何获得C函数的基本编译二进制代码? 2 年前 |
AvirukBasak · gcc中无return语句的尾部递归 2 年前 |
hepl · gcc如何决定在创建可执行文件时使用dynamics库? 2 年前 |