Как следует использовать __attribute__((pcs(aapcs))) в программах HardFP ABI?

У меня есть (очень) простая тестовая программа HardFP ABI. Он без проблем линкуется с другими исполняемыми файлами HardFP. Теперь я хотел использовать функцию из библиотеки Softfp ABI в своем коде, поэтому я изменил файл заголовка (.h) из этой библиотеки, чтобы добавить атрибут: __ attribute__((pcs("aapcs"))) для каждой функции, которая использует двойные аргументы (например: void doSomething(двойной аргумент, двойной аргумент2)), поэтому я сообщаю цепочке инструментов, что эта библиотека использует 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: ошибка: /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/o ut/target/product/flatfish/obj/lib/libm.so использует аргументы регистра VFP, вывод не

(Конечно, libc, libstdc++ и libm тоже хардфп).

Он не компилируется.

Итак, мой вопрос: Как __attribute__((pcs("aapcs"))) следует использовать, чтобы позволить программам HardFP ABI связываться с двоичными файлами Softfp ABI?

Я думал, что это и есть цель такого флага. Я ошибся?

Спасибо!!


person Juan Gómez    schedule 08.03.2015    source источник


Ответы (1)


Хорошо, я уже понял проблему.

Как я и думал, атрибут работает как положено. Ассемблерный код, сгенерированный компилятором (gcc), если я пишу префикс: __attribute__((pcs("aapcs"))) перед объявлением функции, использует r регистрируется для передачи значений аргументов, поэтому вызываемый объект в режиме Softfp работает идеально.

Мне просто нужно было добавить этот флаг в параметры компилятора:

--нет-предупреждения-несоответствие

person Juan Gómez    schedule 10.08.2015