Ошибка компиляции ARM, зарегистрированный VFP используется исполняемым файлом, а не объектным файлом - PullRequest
62 голосов
/ 18 марта 2012

У меня была эта проблема в течение последних нескольких дней, и я не могу понять, что здесь на самом деле происходит, или в чем проблема.

У меня есть make-файл с этими флагами:

CC = arm-linux-gnueabihf-gcc-4.6
FLAGS = -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -mfloat-abi=softfp -std=gnu99

У меня есть библиотека в файле .a, в которой есть несколько объектных файлов, все, что мне нужно сделать, это связать их с моим исполняемым файлом.Я знаю прототипы и все такое, единственное, что жалуется, это следующее:

/usr/bin/ld: error: *EXECUTABLE* uses VFP register arguments, *OBJECTFILE* does not
/usr/bin/ld: failed to merge target specific data of file *OBJECTFILE*

Когда я не использую -mfloat-abi = softfp, я получаю еще одну ошибку, связанную с регистрами с плавающей запятой.

Кто-нибудь знает, что вызывает это, и что я могу сделать, чтобы исправить это, например, сделать так, чтобы мой исполняемый файл не использовал аргументы Виртуального регистра с плавающей запятой?

x@x:~/Desktop/perf_test$ make
arm-linux-gnueabihf-gcc-4.6 -c -O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon -ftree-vectorize -std=gnu99 -mfloat-abi=softfp  perf_test.c ../baseline/util.c
arm-linux-gnueabihf-gcc-4.6 -o perf_test perf_test.o util.o  ../baseline/lib.a
/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1

Ответы [ 10 ]

47 голосов
/ 18 марта 2012

Ваш целевой триплет указывает, что ваш компилятор настроен для hard-float ABI. Это означает, что библиотека libgcc также будет hardfp. Сообщение об ошибке указывает, что по крайней мере часть вашей системы использует soft-float ABI.

Если в компиляторе включена поддержка нескольких библиотек (вы можете указать с помощью -print-multi-lib), тогда вы можете использовать -mfloat-abi=softfp, но если нет, то эта опция вам мало поможет: gcc с радостью сгенерирует код softfp, но тогда ' не будет совместимой libgcc для ссылки.

В основном, hardfp и softfp просто не совместимы. Вам нужно настроить всю систему так или иначе.

РЕДАКТИРОВАТЬ: некоторые дистрибутивы являются или будут "multiarch". Если у вас есть один из них, то можно установить оба ABI одновременно, но это достигается путем удвоения всего - проблемы совместимости все еще существуют.

14 голосов
/ 15 декабря 2012

Я обнаружил в системе на жестком диске, где glibc binutils и gcc были скомпилированы, использование gcc дает ту же ошибку.

Решается путем экспорта -mfloat-abi=hard во флаги, затем gcc компилируется без ошибок.

5 голосов
/ 28 мая 2012

Также ошибку можно устранить, добавив несколько флагов, например -marm -mthumb-interwork.Мне было полезно избежать этой же ошибки.

3 голосов
/ 05 января 2017

Я столкнулся с проблемой использования Atollic для ARM на STM32F4 (я полагаю, что это применимо ко всем STM32 с FPU).

Использование плавающей запятой SW не помогло мне (таким образом, правильно компилируется).

Когда STM32cubeMX генерирует код для TrueStudio (Atollic), он не устанавливает модуль FPU в настройках сборки C / C ++ (не уверен насчет сгенерированного кода для других IDE).

Установите FPU в "Target" для (в настройках сборки свойств проекта):

  • Ассемблер
  • C Компилятор
  • C Linker

Затем у вас есть выбор: смешивать HW / SW fp или использовать HW.

Добавляются сгенерированные командные строки для намеченной цели:

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

3 голосов
/ 18 марта 2012

Это предположение, но вам может потребоваться предоставить некоторые или все переключатели, связанные с плавающей запятой, для стадии соединения.

2 голосов
/ 21 января 2018

Я столкнулся с той же проблемой. Я пытался создать приложение Linux для Cyclone V FPGA-SoC. Я столкнулся с проблемой, как показано ниже:

Error: <application_name> uses VFP register arguments, main.o does not

Я использовал набор инструментов arm-linux-gnueabihf-g++, предоставленный встроенным программным средством проектирования Altera.

Это решается путем экспорта: mfloat-abi=hard to flags, затем arm-linux-gnueabihf-g++ компилируется без ошибок. Также включите флаги как CC & LD.

2 голосов
/ 18 мая 2015

В моем случае CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft помогло.Как видите, я использовал его для моего stm32f407.

2 голосов
/ 23 декабря 2013

Используйте те же опции компилятора для связывания.

Пример:

gcc  -mfloat-abi=hard fpu=neon -c -o test.cpp test.o
gcc  -mfloat-abi=hard fpu=neon -c test1.cpp test1.o
gcc test.o test1.o mfloat-abi=hard fpu=neon HardTest
0 голосов
/ 01 ноября 2017

Этот ответ может показаться на поверхности несвязанным, но существует косвенная причина этого сообщения об ошибке.

Во-первых, сообщение об ошибке «Использует регистр VFP ...» напрямую вызвано смешиванием mfloat-abi = soft и mfloat-abi = сложные параметры в вашей сборке.Этот параметр должен быть согласован для всех объектов, которые должны быть связаны.Этот факт хорошо освещен в других ответах на этот вопрос.

Косвенная причина этой ошибки может быть связана с тем, что редактор Eclipse запутывается из-за собственной ошибки в файле проекта .cproject.Редактор Eclipse часто перезаписывает ссылки на файлы, а иногда он разрывается, когда вы вносите изменения в структуру каталогов или расположение файлов.Это также может повлиять на настройки пути к вашему компилятору gcc - и только для подмножества файлов вашего проекта.Хотя я пока не уверен, что именно является причиной этой ошибки, замена файла .cproject резервной копией исправила эту проблему для меня.В моем случае я заметил ошибки .java.null.pointer после добавления пути к каталогу включений и начал получать сообщения «Ошибка регистрации VFP» совершенно неожиданно.В журнале сборки я заметил, что для некоторых из моих источников, локальных по отношению к рабочей области, использовался другой путь к компилятору gcc !?Два компилятора gcc использовали разные настройки float по неизвестным причинам - отсюда и ошибка регистра VFP.

Я сравнил настройки .cproject со старой копией и заметил различия в записях для источников, вызывающих проблему - даже еслипереопределение настроек проекта было отключено.При замене файла .cproject старой версией проблема исчезла, и я оставляю этот ответ как напоминание о том, что произошло.

0 голосов
/ 01 августа 2016

В моем конкретном случае -g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork сработало.

...