Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

216
Views
Con respecto a la bandera abi de coma flotante utilizada al compilar una aplicación para el objetivo del brazo

Recientemente he escrito aplicaciones c para el objetivo del brazo. Para realizar una compilación cruzada de una aplicación para el objetivo del brazo, había que usar una -mfloat-abi=hard . Pero en realidad no entendí lo que significa. ¿Alguien puede explicar qué significa la bandera? ¿Qué cambios hará al compilar la aplicación?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La diferencia radica en la convención de llamada. ARM usa convenciones de llamadas basadas en registros, en las que tanto los argumentos de una función (hasta un límite, después del cual comienzan a pasar a la pila) como el valor devuelto, se pasan en registros (para obtener todos los detalles sangrientos, consulte el Estándar de llamada de procedimiento ). Cuando se trata de valores de punto flotante, la presencia o no de un coprocesador FPU de hardware plantea un pequeño enigma sobre cómo manejar los valores de punto flotante, lo que brinda dos posibilidades al generar código:

  • Hard-float : asume que el hardware de punto flotante está presente, y los argumentos FP y los valores devueltos se pasan en los registros FPU. Es más eficiente cuando tiene una FPU, pero no es portátil para máquinas sin una, donde el código explotaría al intentar acceder a registros que no existen.

  • Soft-float : los argumentos de punto flotante se pasan en registros de propósito general de la misma manera que los enteros de 32 o 64 bits. La función de destinatario puede luego transferirlos a registros FPU para hacer su trabajo si tiene soporte de hardware, o recurrir a la emulación de punto flotante si no lo tiene. Por lo tanto, su código puede funcionar en cualquier lugar con el soporte de biblioteca adecuado, a costa de una ligera sobrecarga incluso en hardware FPU real (que puede volverse más significativo para funciones triviales).

A partir de eso, probablemente pueda deducir por qué no puede mezclar los dos, digamos que podría compilar una llamada de función como flotante suave, pero vincular a una biblioteca flotante dura que implementa esa función: su código de llamada podría poner un argumento flotante en r1 , pero el código de destino lo buscará en s0 y procederá a calcular tonterías con cualquier valor de basura que haya allí. De manera similar, la función de la biblioteca devolvería un resultado flotante en s0 , pero su código se ejecutaría con lo que haya quedado en r0 y sería aún más incorrecto.

Por lo tanto, si su cadena de herramientas proporciona bibliotecas flotantes, solo puede vincularlas si compila su código como flotante y viceversa. Tenga en cuenta que la magia de multilib significa que una sola cadena de herramientas puede admitir ambas, al tener ambas versiones de cada biblioteca y elegir automáticamente la correcta cuando se vincula.

over 4 years ago · Santiago Trujillo Report

0

Echa un vistazo a la documentación :

-mfloat-abi=name Especifica qué ABI de punto flotante usar. Los valores permitidos son: 'soft', 'softfp' y 'hard'. Especificar 'suave' hace que GCC genere una salida que contiene llamadas de biblioteca para operaciones de punto flotante. 'softfp' permite la generación de código usando instrucciones de punto flotante de hardware, pero aún usa las convenciones de llamada de flotante suave. 'duro' permite la generación de instrucciones de punto flotante y utiliza convenciones de llamadas específicas de FPU.

El valor predeterminado depende de la configuración de destino específica. Tenga en cuenta que las ABI flotantes y flotantes no son compatibles con enlaces; debe compilar todo su programa con la misma ABI y vincularlo con un conjunto compatible de bibliotecas.

Eso significa que hard usa instrucciones de coma flotante específicas del hardware. soft no usará esas instrucciones, pero implementará las operaciones de FP como una biblioteca de software.

Finalmente, softfp significa que usará las convenciones de llamadas soft (y otras ABI), es decir, no usará los registros de hardware de FP para pasar o tomar parámetros, pero usará las instrucciones de FP de hardware, si están disponibles.

El soft y el softfp son compatibles con link, es decir, usan el mismo ABI, por lo que puede mezclarlos en el mismo programa. Pero hard usará registros de hardware para pasar argumentos, por lo que no se puede mezclar con los otros dos.

¿Cuál usar? Bueno, eso depende del sistema que estés usando. Las bibliotecas del sistema operativo se compilarán para una ABI u otra, y el compilador nativo solo usará eso. Pero si está utilizando un compilador cruzado, es posible que deba especificar la ABI manualmente.

La excepción es que si está utilizando un sistema operativo con ABI soft y lo está ejecutando en un hardware que sabe que es capaz de FP duro, entonces puede compilar sus programas como softfp y aprovechar esa característica sin romper la vinculación. .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!