应该如何在HardFP ABI程序中使用__attribute __((pcs(" aapcs")))?

时间:2015-03-08 21:18:33

标签: android gcc arm calling-convention toolchain

我有一个HardFP ABI(非常)简单的测试程序。它与其他HardFP二进制文件链接没有任何问题。现在我想在我的代码中使用Softfp ABI库中的函数,所以我从这个库中更改了头文件(.h),以便在每个函数上添加attibute:__ attribute __((pcs(“aapcs”)))使用双args(如:void doSomething(double arg,double arg2)),所以我告诉工具链这个库使用softfp ABI。问题是工具链(arm-linux-androideabi-4.9)让我大喊:

  

/media/data_disk/b2g/work/hardfp/arm-linux-androideabi-4.9/bin /../ LIB / GCC /臂-Linux的androideabi / 4.9.x-谷歌/../../。 ./../arm-linux-androideabi/bin/ld:错误:/tmp/cc6SmP3D.o使用VFP寄存器参数,输出不   /media/data_disk/b2g/work/hardfp/arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9.x-google/../../../。 ./arm-linux-androideabi/bin/ld:错误:/home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libc.so使用VFP寄存器参数,输出不   /media/data_disk/b2g/work/hardfp/arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9.x-google/../../../。 ./arm-linux-androideabi/bin/ld:错误:/home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libstdc++.so使用VFP寄存器参数,输出不   /media/data_disk/b2g/work/hardfp/arm-linux-androideabi-4.9/bin/../lib/gcc/arm-linux-androideabi/4.9.x-google/../../../。 ./arm-linux-androideabi/bin/ld:错误:/home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libm.so使用VFP寄存器参数,输出不

(当然,libc,libstdc ++和libm也是hardfp)。

它无法编译。

所以我的问题是, 如何使用__attribute __((pcs(“aapcs”)))让HardFP ABI程序与Softfp ABI二进制文件链接?

我认为这就是这样一面旗帜的目的。我错了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我已经找到了问题。

正如我所想,该属性按预期工作。编译器生成的汇编代码(gcc)如果我在函数声明前面写了前缀: __ attribute __((pcs(“aapcs”))),则使用 r 注册以传递参数值,因此被调用者在Softfp模式下工作正常。

我只需要将此标志添加到编译器选项中:

<强> - 无警告失配