Es sorprendente que gcc no lo admita de forma nativa ya que el código está claramente disponible en la fuente dentro de un directorio llamado soft-fp
. Es posible compilar esa biblioteca manualmente:
$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc
$ cd libgcc/soft-fp/
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c
$ ar -crv libsoft-fp.a *.o
Hay algunos archivos de C, que no compilan debido a errores, pero la mayoría se compila. Después de copiar libsoft-fp.a
en el directorio con los archivos de origen que ahora compilarse bien con -msoft-float
:
$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L.
Una rápida inspección utilizando
$ objdump -D --disassembler-options=intel a.out | less
muestra que como se esperaba ningún x87 instrucciones de coma flotante se llama y se ejecuta el código considerablemente más lento también, por un factor de 8 en mi ejemplo, que usa mucha división.
Nota: Hubiera preferido para compilar la biblioteca suave-flotador con
$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c
pero que se traduce en un montón de mensajes de error como
adddf3.c: In function '__adddf3':
adddf3.c:46: error: unknown register name 'st(1)' in 'asm'
parece que es la versión i386
no bien mantenido como st(1)
apunta a uno de los registros x87 que obviamente no están disponibles cuando se usa -msoft-float
. Extraña o afortunadamente, la versión arm
compila bien en un i386
y parece funcionar bien.
Gracias por la respuesta. Intenté arrancar uclibc usando buildroot pero parece estar ignorando .config. Lo proporcioné en BR2_UCLIBC_CONFIG, al menos para la opción UCLIBC_HAS_FPU:/ – bdonlan
@Alex El enlace de la cadena de herramientas uclibc está roto. http://uclibc.org/toolchains.html debería ser apropiado? – zengr