He compilado GCC junto con newlib en Mac OS X para objetivos ARM. Sin embargo, libc.a se compiló con -fshort-enums, y no quiero eso porque cuando compilo cosas para ARM, uso -fno-short-enums. Esto conflictos, por supuesto:Compilación cruzada de GCC con newlib para ARM: cómo especificar las opciones de GCC como -march?
ld: warning: /var/folders/9m/2wnjp9zd71x13cpdpf16y_4r0000gn/T//ccQuEnp6.o uses 32-bit enums yet the output is to use variable-size enums; use of enum values across objects may fail
Cada vez que intento ejecutar un "¡Hola, mundo!" ejecutable, segfaults. Podría ser ésta la razón?
Aquí está el comando que utiliza para compilar hola.c:
arm-eabi-gcc \
hello.c -o hello \
/Users/user/gcc-arm-install/arm-eabi/lib/crt0.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtbegin.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crti.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtn.o \
/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/crtend.o \
-v -nostdinc -nostdlib -static \
-march=armv7-a -mno-thumb-interwork -marm -mfpu=neon -mfloat-abi=softfp -fpic \
-ffunction-sections -fno-short-enums -fno-rtti -fno-exceptions \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include \
-I/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0/include-fixed \
-I/Users/user/gcc-arm-install/arm-eabi/include \
-I/Users/user/gcc-arm-install/arm-eabi/sys-include \
-L/Users/user/gcc-arm-install/arm-eabi/lib \
-L/Users/user/gcc-arm-install/lib/gcc/arm-eabi/4.7.0 \
-lm -lc -lgcc
Actualización:
acuerdo, creo que he reducido el problema a la combinación de libc de newlib y la puesta en marcha archivos (crt0.o). Traté de compilar una aplicación de prueba con GCC 4.7.0 usando libc.a y archivos de inicio de Android NDK, y eso funcionó en el teléfono cuando se compiló estática. De hecho, funcionó a pesar de que me había vuelto a quejar sobre libgcc usando "enums de tamaño variable" (es decir, no compilado con -fno-short-enums como todo lo demás). Entonces, mi hipótesis sobre -fno-short-enums siendo el culpable en mis binarios anteriores que fallaban era incorrecta.
Esto es lo que está funcionando:
Binutils y GCC 4.7.0 compilado desde el código fuente para el objetivo de "brazo-linux-EABI." Configuré GCC usando --with-newlib (newlib y libgloss en el árbol fuente de GCC). Entonces, GCC en realidad se construyó con newlib y se instaló junto con newlib, y genera binarios de trabajo siempre que no enlace con la libc de newlib. En este momento, debo usar libc de Andoid NDK y sus archivos de inicio en su lugar.
Mi script de compilación se parece a esto. La inclusión y rutas de bibliotecas señalan la NDK y libc incluye:
NDK_PATH="/Users/user/SOURCE/android-ndk-r8/platforms/android-9/arch-arm"
CFLAGS="-nostdinc -nostdlib -static -fno-short-enums -lc -lgcc -lc"
gcc $NDK_PATH/usr/lib/crtbegin_static.o \
hello.c -o hello $CFLAGS \
$NDK_PATH/usr/lib/crtend_android.o
todavía quiero conseguir binarios compilados estáticamente con el trabajo de libc newlib. Volver a las secuencias de comandos del shell ...
Es difícil de responder pero suena fácil de probar; ¿No es bastante fácil probar si la compilación de hello.c con '-fshort-enums' corrige el bloqueo? –
¿Ha considerado descargar [la fuente de libc.a] (http://www.gnu.org/software/libc/) y compilarlo usted mismo? –
-fshort-enums suprime la advertencia, pero sigo teniendo un bloqueo :-( – Synthetix