ARM кросс-компиляция, «VFP зарегистрирован используется x.out, не y.o» проблема в Linux, но не в Windows - PullRequest
0 голосов
/ 29 июня 2018

Я кросс-компилирую проект для цели ARM Cortex-M4F. Я успешно кросс-компилировал этот проект в течение нескольких месяцев на ПК с Windows 7, и теперь я должен иметь возможность кросс-компилировать его также из среды Linux (работающей на виртуальной машине в среде Windows). Сборка выполняется с точно таким же переносимым Makefile, поэтому вызовы компилятора и компоновщика абсолютно одинаковы, за исключением путей.

Хотя в Windows все идет хорошо, у меня есть куча ошибок в Linux (Ubuntu 18.04), когда вызывается компоновщик (компиляция всех файлов идет хорошо):

/ usr / lib / gcc / arm-none-eabi / 6.3.1 /../../../ arm-none-eabi / bin / ld: ошибка: / usr / lib / gcc / arm- none-eabi / 6.3.1 /../../../ arm-none-eabi / lib / crt0.o: конфликтующие архитектуры ЦП 13/1

/ usr / lib / gcc / arm-none-eabi / 6.3.1 /../../../ arm-none-eabi / bin / ld: не удалось объединить конкретные данные файла / usr / Библиотека / GCC / рычажного ни-EABI / 6.3.1 /../../../ рычажного ни-EABI / Библиотека / crt0.o

myProgram.out использует аргументы регистра VFP, /usr/lib/gcc/arm-none-eabi/6.3.1/../../../arm-none-eabi/lib/libc_nano.a(lib_a -nano-vfprintf_i.o) не [И еще как ...]

Я прочитал вопрос и ответы Ошибка компиляции ARM, зарегистрированный VFP используется исполняемым файлом, а не объектным файлом , а также Как (перекрестно) скомпилировать как ARM, так и soft-float (softfp) с одним GCC (кросс-) компилятором? и хотя они действительно помогли понять одну часть проблемы, ни один из них не привел меня к решению.

В обеих ОС я использую arm-none-eabi-gcc V6.3.1:

Windows 7 64-битная

gcc версия 6.3.1 20170215 (выпуск) [ARM / Embedded-6-Branch Revision 245512] (Инструменты GNU для встроенных процессоров ARM 6-2017-q1-обновление)

Ubuntu 18.04

gcc версия 6.3.1 20170620 (15: 6.3.1 + svn253039-1build1)

И у обоих, похоже, одинаковые мультибиблиотеки:

Windows 7 64-битная

.; большой палец; @mthumb трудно; @ mfloat-аби = жесткий палец / v6-м; @ mthumb @ марш = armv6s-м большой палец / V7-м; @ mthumb @ марш = ARMv7-м большой палец / v7e-м; @ mthumb @ марш = armv7e-м большой палец / v7-ар; @ mthumb @ марш = ARMv7 большой палец / v8-m.base; @ mthumb @ марш = armv8-m.base большой палец / v8-m.main; @ mthumb @ марш = armv8-m.main палец / v7e м / fpv4-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = softfp палец / v7e м / fpv4-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = трудно палец / v7e м / fpv5-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-SP-D16 @ mfloat-ABI = softfp палец / v7e м / fpv5-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv5-SP-D16 @ mfloat-ABI = трудно палец / v7e м / fpv5 / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-D16 @ mfloat-ABI = softfp большой палец / v7e м / fpv5 / жесткий; @ mthumb @ марш = armv7e м @ МФП = fpv5-d16 @ mfloat-аби = жесткий палец / V7-ар / fpv3 / softfp; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-D16 @ mfloat-ABI = softfp большой палец / v7-ар / fpv3 / жесткий; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жесткого палец / v8-m.main / fpv5-SP / softfp; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-SP-D16 @ mfloat-ABI = softfp большой палец / v8-m.main / fpv5-зр / жесткий; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-зр-d16 @ mfloat-аби = жесткий палец / v8-m.main / fpv5 / softfp; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-D16 @ mfloat-ABI = softfp большой палец / v8-m.main / fpv5 / жесткий; @ mthumb @ марш = armv8-m.main @ МФП = fpv5-d16 @ mfloat-аби = жесткий

Ubuntu 18.04

.; большой палец; @mthumb трудно; @ mfloat-аби = жесткий палец / v6-м; @ mthumb @ марш = armv6s-м большой палец / V7-м; @ mthumb @ марш = ARMv7-м большой палец / v7e-м; @ mthumb @ марш = armv7e-м большой палец / v7-ар; @ mthumb @ марш = ARMv7 палец / v7e м / fpv4-SP / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = softfp палец / v7e м / fpv4-SP / жесткий; @ mthumb @ марш = armv7e-м @ МФП = fpv4-SP-D16 @ mfloat-ABI = трудно палец / v7e м / fpv5 / softfp; @ mthumb @ марш = armv7e-м @ МФП = fpv5-D16 @ mfloat-ABI = softfp большой палец / v7e м / fpv5 / жесткий; @ mthumb @ марш = armv7e м @ МФП = fpv5-d16 @ mfloat-аби = жесткийпалец / V7-ар / fpv3 / softfp; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-D16 @ mfloat-ABI = softfp большой палец / v7-ар / fpv3 / жесткий; @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жесткого большой палец / v7-ар / fpv3 / жесткий / быть, @ mthumb @ марш = ARMv7 @ МФП = VFPv3-d16 @ mfloat-аби = жестким @ mbig-Endian

Из того, что я читал здесь и там, очень важно указать, хотим ли мы реализовать реализацию с плавающей или мягкой плавающей запятой. Я хочу использовать аппаратное обеспечение, поэтому каждый вызов gcc (компилятор сборки, компилятор C, компоновщик) имеет эти два флага:

-mfloat-abi = hard -mfpu = fpv4-sp-d16

Вот другие флаги компилятора:

-функция-разделы -fdata-секции -fno-строго-псевдонимы -fno-встроенные -short-enums -MP -MD

И флаги компоновщика:

-Xlinker -mthumb -mabi = aapcs -mcpu = cortex-m4 -lrdimon -u _printf_float --specs = nano.specs -lc -lnosys -Wl, - gc-section

Я просто не вижу здесь, что может быть причиной этих сообщений об ошибках, поскольку реализация указывается каждый раз. Единственная гипотеза, которую я имею, состоит в том, что некоторые библиотеки (например, lib_a-nano, которые мы видим в ошибке) созданы для мягкой реализации. Но, допустим, в этом проблема, как использовать ту же библиотеку, созданную для сложной реализации?

...