__attribute__((pcs("aapcs"))) 在 HardFP ABI 程序中应该如何使用?
How should __attribute__((pcs("aapcs"))) be used in HardFP ABI programs?
我有一个 HardFP ABI(非常)简单的测试程序。它 link 与其他 HardFP 二进制文件一起使用没有任何问题。现在我想在我的代码中使用 Softfp ABI 库中的函数,所以我更改了该库中的头文件 (.h) 以添加属性:__ attribute__((pcs("aapcs") )) 在每个使用双参数的函数上(比如: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/arm-linux-androideabi/4.9.x-google/../../../../arm-linux-androideabi/bin/ld: error: /tmp/cc6SmP3D.o uses VFP register arguments, output does not
/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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libc.so uses VFP register arguments, output does not
/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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libstdc++.so uses VFP register arguments, output does not
/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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libm.so uses VFP register arguments, output does not
(当然libc、libstdc++、libm也是hardfp)
无法编译。
所以我的问题是,
如何使用 __attribute__((pcs("aapcs"))) 让 HardFP ABI 程序 link 与 Softfp ABI 二进制文件?
我认为这就是这样一个标志的目的。我错了吗?
谢谢!!
好的,我已经找到问题了
如我所想,该属性按预期工作。编译器(gcc)生成的汇编代码如果我在函数声明前写前缀:__attribute__((pcs("aapcs"))),正在使用 r 寄存器来传递参数值,因此被调用方在 Softfp 模式下工作完美。
我只需要将此标志添加到编译器选项:
--无警告不匹配
我有一个 HardFP ABI(非常)简单的测试程序。它 link 与其他 HardFP 二进制文件一起使用没有任何问题。现在我想在我的代码中使用 Softfp ABI 库中的函数,所以我更改了该库中的头文件 (.h) 以添加属性:__ attribute__((pcs("aapcs") )) 在每个使用双参数的函数上(比如: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/arm-linux-androideabi/4.9.x-google/../../../../arm-linux-androideabi/bin/ld: error: /tmp/cc6SmP3D.o uses VFP register arguments, output does not /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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libc.so uses VFP register arguments, output does not /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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libstdc++.so uses VFP register arguments, output does not /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: error: /home/jgomez/b2g/build.flatfish.hardfp/out/target/product/flatfish/obj/lib/libm.so uses VFP register arguments, output does not
(当然libc、libstdc++、libm也是hardfp)
无法编译。
所以我的问题是, 如何使用 __attribute__((pcs("aapcs"))) 让 HardFP ABI 程序 link 与 Softfp ABI 二进制文件?
我认为这就是这样一个标志的目的。我错了吗?
谢谢!!
好的,我已经找到问题了
如我所想,该属性按预期工作。编译器(gcc)生成的汇编代码如果我在函数声明前写前缀:__attribute__((pcs("aapcs"))),正在使用 r 寄存器来传递参数值,因此被调用方在 Softfp 模式下工作完美。
我只需要将此标志添加到编译器选项:
--无警告不匹配