gcc arm calling-convention

¿Cómo compilar(cruzado) tanto ARM de hard- como de soft float(softfp) con un único compilador GCC(cruzado)?



calling-convention (2)

Según las preguntas frecuentes de Linaro, si su compilador imprime arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft entonces solo puede usar -march=armv4t . Si desea usar -march=armv7-a , necesita compilar usted mismo el compilador.

El siguiente enlace podría ser útil para construir usted mismo GCC ARM Builds

Me gustaría usar un único compilador (cruzado) para compilar código para diferentes convenciones de llamadas ARM: dado que siempre quiero usar instrucciones de coma flotante y NEON, solo quiero seleccionar la convención de llamadas de flotación rígida o el flotación blanda (softfp) convención de llamadas.

Mi compilador predeterminado es hard-float, pero admite las dos arquitecturas que necesito:

$ arm-linux-gnueabihf-gcc -print-multi-lib .; arm-linux-gnueabi;@marm@march=armv4t@mfloat-abi=soft $

Cuando compilo con los parámetros predeterminados:

$ arm-linux-gnueabihf-g++ -Wall -o hello_world_armhf hello_world.cpp

Tiene éxito sin ningún error.

Si compilo con los parámetros devueltos por -print-multi-lib:

$ arm-linux-gnueabihf-g++ -marm -march=armv4t -mfloat-abi=soft -Wall -o hello_world hello_world.cpp

Nuevamente se compila sin error (Por cierto, ¿cómo puedo probar que el código resultante es de flotación blanda o suave?)

Lamentablemente, si pruebo esto:

$ arm-linux-gnueabihf-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -Wall -o hello_world hello_world.cpp [...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: error: hello_world uses VFP register arguments, /tmp/ccwvfDJo.o does not [...]/gcc/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/../../../../arm-linux-gnueabihf/bin/ld: failed to merge target specific data of file /tmp/ccwvfDJo.o collect2: error: ld returned 1 exit status $

He probado algunas otras permutaciones de los parámetros, pero parece que cualquier cosa que no sea la combinación que se muestra con -print-multi-lib da como resultado un error.

He leído el error de compilación ARM, el VFP registrado utilizado por el ejecutable, no el archivo objeto, pero el problema era que algunas partes del binario eran suaves, y algunas eran duras. Tengo un solo archivo C ++ para compilar ...

¿Qué parámetro (s) echo de menos para poder compilar con -march = armv7-a -ththumb-interwork -mfloat-abi = softfp -mfpu = neon?

¿Cómo es posible que el error sea sobre los argumentos de registro de VFP mientras que explícitamente tengo -mfloat-abi = softfp en la línea de comando que prohíbe los argumentos de registro de VFP?

¡Gracias!

Para los registros, hello_world.cpp contiene lo siguiente:

#include <iostream> int main() { std::cout << "Hello, world!" << std::endl; return 0; }


Necesita otro compilador con el correspondiente soporte multilib. Puede verificar el soporte multilib con el próximo comando.

arm-none-eabi-gcc -print-multi-lib .; thumb;@mthumb fpu;@mfloat-abi=hard armv6-m;@mthumb@march=armv6s-m armv7-m;@mthumb@march=armv7-m armv7e-m;@mthumb@march=armv7e-m armv7-ar/thumb;@mthumb@march=armv7 cortex-m7;@mthumb@mcpu=cortex-m7 armv7e-m/softfp;@mthumb@march=armv7e-m@mfloat-abi=softfp@mfpu=fpv4-sp-d16 armv7e-m/fpu;@mthumb@march=armv7e-m@mfloat-abi=hard@mfpu=fpv4-sp-d16 armv7-ar/thumb/softfp;@mthumb@march=armv7@mfloat-abi=softfp@mfpu=vfpv3-d16 armv7-ar/thumb/fpu;@mthumb@march=armv7@mfloat-abi=hard@mfpu=vfpv3-d16 cortex-m7/softfp/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-sp-d16 cortex-m7/softfp/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=softfp@mfpu=fpv5-d16 cortex-m7/fpu/fpv5-sp-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-sp-d16 cortex-m7/fpu/fpv5-d16;@mthumb@mcpu=cortex-m7@mfloat-abi=hard@mfpu=fpv5-d16 https://.com/questions/37418986/how-to-interpret-the-output-of-gcc-print-multi-lib

Cómo interpretar el resultado de gcc -print-multi-lib Con esta configuración gcc -mfloat-abi=hard no solo compilará sus archivos utilizando instrucciones FPU sino que también los vinculará con las libs correspondientes, evitando que "X use argumentos de registro de VFP, Y lo hace no " error "

El resultado de impresión -print-multi-lib impresión -print-multi-lib arriba mencionado producido por gcc con este parche y --with-multilib-list=armv6-m,armv7,armv7-m,armv7e-m,armv7-r,armv7-a,cortex-m7 opción de configuración --with-multilib-list=armv6-m,armv7,armv7-m,armv7e-m,armv7-r,armv7-a,cortex-m7 . Si está interesado en construir su propio gcc con el soporte multilib de la serie Cortex-A, simplemente use --with-multilib-list=aprofile opción de configuración de --with-multilib-list=aprofile para cualquier arm*-*-* objetivo sin ningún parche ( en la lista con gcc-6.2. 0 ).