Error de compilación ARM, VFP registrado utilizado por el ejecutable, no el archivo objeto


He estado teniendo este problema durante los últimos días y no puedo entender lo que realmente está sucediendo aquí, o cuál es el problema.

Tengo un makefile con estas banderas:

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

Tengo una biblioteca en a .un archivo, que tiene algunos archivos objeto, todo lo que necesito hacer es vincularlos con mi ejecutable. Conozco los prototipos y todo eso, lo único que se queja es lo siguiente:

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

Cuando no uso-mfloat-abi=softfp, obtengo otro error en relación con los registros de coma flotante.

¿Alguien tiene alguna idea de lo que está causando esto, y lo que puedo hacer para arreglarlo, como hacer que mi ejecutable no use argumentos de Registro de Coma Flotante Virtual?

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
Author: M.M, 2012-03-18

10 answers

Su triplete de destino indica que su compilador está configurado para el hard-float ABI. Esto significa que la biblioteca libgcc también será hardfp. El mensaje de error indica que al menos parte de su sistema está usando soft-float ABI.

Si el compilador tiene multilib habilitado (se puede decir con -print-multi-lib), entonces puede usar -mfloat-abi=softfp, pero si no, esa opción no le ayudará mucho: gcc generará felizmente código softfp, pero entonces no habrá libgcc compatible para vincular contra.

Básicamente, hardfp y softfp no son compatibles. Necesita configurar todo su sistema de una manera u otra.

EDITAR: algunas distribuciones son, o serán, "multiarch". Si usted tiene uno de esos entonces es posible instalar ambos ABIs a la vez, pero eso se hace duplicando todo -- los problemas de compatibilidad todavía existen.

 41
Author: ams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-17 21:36:57

He encontrado en un sistema arm hardfloat donde glibc binutils y gcc fueron crosscompiled, usando gcc da el mismo error.

Se resuelve exportando-mfloat-abi=hard a flags, luego gcc compila sin errores.

 14
Author: 白い熊,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-15 11:28:02

También el error se puede resolver agregando varias banderas, como -marm -mthumb-interwork. Fue útil para mí evitar este mismo error.

 4
Author: AVG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 06:44:37

Esto es una conjetura, pero es posible que también necesite suministrar algunos o todos los switches relacionados con el punto flotante para la etapa de enlace.

 3
Author: blueshift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-17 21:36:00

Use las mismas opciones de compilador para enlazar también.

Ejemplo:

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
Author: raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-23 18:58:44

En mi caso CFLAGS = -O0 -g -Wall -I. -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=soft ha ayudado. Como puedes ver, lo usé para mi stm32f407.

 2
Author: user4912846,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 15:56:44

Encontré el problema usando Atollic para ARM en STM32F4 (supongo que se aplica a todos los STM32 con FPU).

Usar coma flotante SW no funcionó bien para mí (compilando correctamente).

Cuando STM32CubeMX genera código para TrueStudio (Atollic), no establece una unidad FPU en la configuración de compilación de C/C++ (no está seguro del código generado para otros IDE).

Establecer una FPU en "Target" para (en configuración de compilación de propiedades del proyecto):

  • Ensamblador
  • C Compilador
  • C Enlazador

Entonces usted tiene la opción de mezclar HW/SW fp o utilizar HW.

Las líneas de comando generadas se agregan con esto para el destino deseado:

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

Brazoatollic

 1
Author: SMFSW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-17 10:26:11

Me enfrentaba al mismo problema. Estaba tratando de construir una aplicación Linux para Cyclone V FPGA-SoC. Me enfrenté al problema de la siguiente manera:

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

Estaba usando la cadena de herramientas arm-linux-gnueabihf-g++ proporcionada por embedded software design tool de altera.

Se resuelve exportando: mfloat-abi=hard a flags, entonces arm-linux-gnueabihf-g++ compila sin errores. También incluya las banderas en ambos CC & LD.

 1
Author: Manish Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 16:48:40

En mi caso particular -g -march=armv7-a -mfloat-abi=hard -mfpu=neon -marm -mthumb-interwork funcionó.

 0
Author: LS1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-31 22:41:09

Esta respuesta puede aparecer en la superficie como no relacionada, pero hay una causa indirecta de este mensaje de error.

Primero, el "Usa el registro VFP..."el mensaje de error es causado directamente por la mezcla de opciones mfloat-abi=soft y mfloat-abi=hard dentro de su compilación. Esta configuración debe ser coherente para todos los objetos que se vayan a vincular. Este hecho está bien cubierto en las otras respuestas a esta pregunta.

La causa indirecta de este error puede deberse a que el editor de Eclipse confundido por un error autoinfligido en el proyecto ".cproject " archivo. El editor de Eclipse con frecuencia vuelve a crear enlaces de archivos y, a veces, se rompe cuando realiza cambios en las estructuras de directorios o ubicaciones de archivos. Esto también puede afectar la configuración de la ruta de acceso a su compilador gcc, y solo para un subconjunto de los archivos de su proyecto. Mientras que todavía no estoy seguro de exactamente lo que causa este fracaso, la sustitución de la .cproject archivo con una copia de seguridad corregido este problema para mí. En mi caso me di cuenta .Java.nulo.errores de puntero después de agregar una ruta de directorio de inclusión y comenzó a recibir los mensajes de "error de registro VFP" de la nada. En el registro de compilación me di cuenta de que una ruta diferente al compilador gcc se estaba utilizando para algunas de mis fuentes que eran locales para el espacio de trabajo, pero no todos ellos!? Los dos compiladores de gcc estaban usando diferentes configuraciones de flotación por razones desconocidas, de ahí el error del registro VFP.

Comparé el.cproject settings with a older copy and observed diferencias en las entradas de las fuentes que causan el problema, a pesar de que la anulación de la configuración del proyecto estaba desactivada. Reemplazando el .cproject archivo con la versión anterior el problema se fue, y estoy dejando esta respuesta como un recordatorio de lo que sucedió.

 0
Author: Rod Dewell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-31 22:42:51