it-swarm.com.de

ARM Kompilierungsfehler, VFP registriert von ausführbarer Datei, nicht Objektdatei

Ich habe dieses Problem in den letzten Tagen gehabt, und ich kann mich nicht damit beschäftigen, was hier wirklich passiert oder was das Problem ist.

Ich habe ein Makefile mit diesen Flags:

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

Ich habe eine Bibliothek in einer .a-Datei, die einige Objektdateien enthält. Alles, was ich tun muss, ist, sie mit meiner ausführbaren Datei zu verlinken. Ich kenne die Prototypen und all das, das einzige, was sich beklagt, ist folgendes:

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

Wenn ich die Option -mfloat-abi = softfp nicht verwende, erhalte ich einen weiteren Fehler in Bezug auf Fließkommaregister.

Hat jemand eine Idee, was dies verursacht und was ich tun kann, um das Problem zu beheben, indem ich es beispielsweise so mache, dass meine ausführbare Datei keine Argumente für das virtuelle Floating Point-Register verwendet?

[email protected]:~/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
56
Jim

Ihr Zieltripel zeigt an, dass Ihr Compiler für die ABI hard float konfiguriert ist. Dies bedeutet, dass die libgcc-Bibliothek auch hardfp ist. Die Fehlermeldung zeigt an, dass mindestens ein Teil Ihres Systems soft-float ABI verwendet.

Wenn der Compiler Multiblib aktiviert hat (Sie können dies mit -print-multi-lib feststellen), können Sie -mfloat-abi=softfp verwenden. Wenn dies nicht der Fall ist, wird Ihnen diese Option nicht viel helfen gegen.

Grundsätzlich sind Hardfp und Softfp einfach nicht kompatibel. Sie müssen Ihr gesamtes System auf die eine oder andere Weise konfigurieren.

EDIT: Einige Distros sind oder werden "Multiarch" sein. Wenn Sie eines davon haben, ist es möglich, beide ABIs auf einmal zu installieren. Dazu wird jedoch alles verdoppelt - die Kompatibilitätsprobleme bestehen weiterhin.

42
ams

Ich habe auf einem Hardfloat-System gefunden, wo glibc binutils und gcc kreuzkompiliert wurden. Gcc gibt den gleichen Fehler aus.

Es wird gelöst, indem -mfloat-abi=hard in Flags exportiert wird, dann kompiliert gcc fehlerfrei.

14
白い熊

Der Fehler kann auch durch Hinzufügen mehrerer Flags wie -marm -mthumb-interwork behoben werden. Es war hilfreich für mich, diesen Fehler zu vermeiden. 

4
AVG

Dies ist nur eine Vermutung, aber Sie müssen möglicherweise einige oder alle der auf Fließkomma bezogenen Switches auch für die Verbindungsstufe bereitstellen.

3
blueshift

In meinem Fall hat CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft geholfen. Wie Sie sehen, habe ich es für mein stm32f407 verwendet.

2
user4912846

Das Problem bei der Verwendung von Atollic für ARM auf STM32F4 ist aufgetreten (ich denke, es gilt für alle STM32 mit FPU).

Die Verwendung von SW-Gleitkommazahl hat für mich nicht gut funktioniert (also korrekt kompiliert).

Wenn STM32cubeMX Code für TrueStudio (Atollic) generiert, wird keine FPU-Einheit in C/C++ - Buildeinstellungen festgelegt (nicht sicher, ob generierter Code für andere IDEs generiert wurde).

Legen Sie eine FPU in "Target" für (unter Projekteigenschaften Build-Einstellungen) fest:

  • Assembler
  • C Compiler
  • C Linker

Dann haben Sie die Wahl, HW/SW fp zu mischen oder HW zu verwenden.

Erzeugte Befehlszeilen werden hiermit für das beabsichtigte Ziel hinzugefügt:

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

ArmAtollic

2
SMFSW

Verwenden Sie dieselben Compiler-Optionen auch für die Verknüpfung.

Beispiel:

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
2
raj

Ich stand vor demselben Problem. Ich habe versucht, eine Linux-Anwendung für Cyclone V FPGA-SoC zu erstellen. Ich sah das Problem wie folgt: 

 Fehler: <Anwendungsname> verwendet VFP-Registerargumente, main.o nicht 

Ich habe die Toolchain arm-linux-gnueabihf-g++ verwendet, die von Embedded Software Design Tool von altera bereitgestellt wurde.

Sie können dieses Problem lösen, indem Sie: mfloat-abi=hard in Flags exportieren und arm-linux-gnueabihf-g++ ohne Fehler kompilieren. Fügen Sie die Flags auch in CC & LD ein. 

1
Manish Jain

In meinem speziellen Fall hat -g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork funktioniert.

0
LS1

Diese Antwort erscheint möglicherweise an der Oberfläche als nicht zusammenhängend, es gibt jedoch eine indirekte Ursache für diese Fehlermeldung.

Zunächst wird die Fehlermeldung "Verwendet VFP-Register ..." direkt durch das Mischen von mfloat-abi = soft und mfloat-abi = hard-Optionen in Ihrem Build verursacht. Diese Einstellung muss für alle Objekte, die verknüpft werden sollen, konsistent sein. Diese Tatsache wird in den anderen Antworten auf diese Frage gut behandelt.

Die indirekte Ursache für diesen Fehler liegt möglicherweise daran, dass der Eclipse-Editor durch einen selbstverschuldeten Fehler in der ".cproject" -Datei des Projekts verwirrt wird. Der Eclipse-Editor stellt häufig Dateiverknüpfungen erneut her und bricht sich manchmal ab, wenn Sie Änderungen an Ihren Verzeichnisstrukturen oder Dateispeicherorten vornehmen. Dies kann sich auch auf die Pfadeinstellungen zu Ihrem gcc-Compiler auswirken - und nur für einen Teil der Projektdateien. Ich bin mir noch nicht sicher, was genau diesen Fehler verursacht, aber das Ersetzen der .cproject-Datei durch eine Sicherungskopie hat dieses Problem für mich behoben. In meinem Fall bemerkte ich .Java.null.pointer-Fehler nach dem Hinzufügen eines Include-Verzeichnispfads und erhielt die "VFP register error" -Meldungen aus heiterem Himmel. Im Build-Protokoll bemerkte ich, dass für einige meiner lokalen Quellen im Arbeitsbereich ein anderer Pfad zum gcc-Compiler verwendet wurde, aber nicht für alle !? Die beiden gcc-Compiler verwendeten aus unbekannten Gründen unterschiedliche Float-Einstellungen - daher der VFP-Registerfehler.

Ich verglich die .cproject-Einstellungen mit einer älteren Kopie und beobachtete Unterschiede in den Einträgen für die Quellen, die den Fehler verursachten - obwohl das Überschreiben der Projekteinstellungen deaktiviert war. Durch das Ersetzen der .cproject-Datei durch die alte Version ist das Problem behoben, und ich lasse diese Antwort als Erinnerung daran, was passiert ist.

0
Rod Dewell