Cuando compilo código C con mi cadena de herramientas cruzada, el enlazador imprime páginas de advertencias que dicen que mi ejecutable usa flotantes duros pero mi libc usa flotantes suaves. ¿Cual es la diferencia?
Cuando compilo código C con mi cadena de herramientas cruzada, el enlazador imprime páginas de advertencias que dicen que mi ejecutable usa flotantes duros pero mi libc usa flotantes suaves. ¿Cual es la diferencia?
Respuestas:
Los flotadores duros utilizan una unidad de punto flotante en chip. Los flotadores suaves emulan uno en el software. La diferencia es la velocidad. Es extraño ver que ambos se usen en la misma arquitectura de destino, ya que el chip tiene una FPU o no. Puede habilitar el punto flotante suave en GCC con -msoft-float. Es posible que desee recompilar su libc para usar el punto flotante de hardware si lo usa.
Hay tres formas de hacer aritmética de punto flotante:
Estrictamente hablando, todas estas respuestas me parecen incorrectas.
Cuando compilo código C con mi cadena de herramientas cruzada, el enlazador imprime páginas de advertencias que dicen que mi ejecutable usa flotantes duros pero mi libc usa flotantes suaves. ¿Cual es la diferencia?
La wiki de Debian VFP tiene información sobre las tres opciones para -mfloat-abi
,
soft
- esto es puro softwaresoftfp
- esto admite una FPU de hardware, pero la ABI es compatible con software.hard
- el ABI utiliza registros flotantes o VFP .El error del vinculador (cargador) se debe a que tiene una biblioteca compartida que pasará valores de punto flotante en registros enteros. Aún puede compilar su código con a -mfpu=vfp
, etc., pero debe usarlo -mfloat-abi=softfp
para que si la libc necesita un flotante, se pase de una manera que la biblioteca entienda.
El kernel de Linux puede admitir la emulación de las instrucciones de VFP. Obviamente, es mejor compilar con -mfpu=none
para este caso y hacer que la compilación genere código directamente en lugar de depender de cualquier emulación del kernel de Linux. Sin embargo, no creo que el error del OP esté realmente relacionado con este problema. Es independiente y también debe tratarse junto con -mfloat-abi
.
La biblioteca compartida Armv5 con CPU ArmV7 es opuesta a esta; el libc era hard float pero la aplicación solo era soft . Tiene algunas formas de solucionar el problema, pero volver a compilar con las opciones correctas siempre es lo más fácil.
Otro problema es que el kernel de Linux debe admitir tareas VFP (o cualquier punto flotante ARM presente) para guardar / restaurar los registros en un cambio de contexto.
Parece que su libc se creó para operaciones de punto flotante de software, mientras que su exe se compiló asumiendo que el hardware es compatible con punto flotante. A corto plazo, podría forzar flotadores suaves como una bandera del compilador. (si está usando gcc, creo que es -msoft-float)
A largo plazo, si el procesador de su objetivo tiene soporte de hardware para operaciones de punto flotante, generalmente querrá construir o encontrar una cadena de herramientas cruzada con la flotación de hardware habilitada para la velocidad. Algunas familias de procesadores tienen variantes de modelos, algunas con y otras sin soporte de hardware. Entonces, por ejemplo, simplemente decir que su procesador es un ARM es insuficiente para saber si tiene soporte de punto flotante de hardware.
El cálculo puede realizarse mediante hardware de punto flotante o en software basado en aritmética de enteros.
Hacerlo en hardware es mucho más rápido, pero muchos microcontroladores no tienen hardware de punto flotante. En ese caso, puede evitar el uso de punto flotante (generalmente la mejor opción) o confiar en una implementación en software, que será parte de la biblioteca C.
En algunas familias de controladores, por ejemplo ARM, el hardware de punto flotante está presente en algunos modelos de la familia pero no en otros, por lo que gcc para estas familias admite ambos. Su problema parece ser que confundió las dos opciones.