2012-05-30 14 views
31

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 ...

+2

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? –

+0

¿Ha considerado descargar [la fuente de libc.a] (http://www.gnu.org/software/libc/) y compilarlo usted mismo? –

+0

-fshort-enums suprime la advertencia, pero sigo teniendo un bloqueo :-( – Synthetix

Respuesta

2

Para el trabajo realizo la construcción cruzada para la plataforma Cortex-M3, y también uso newlib. Los siguientes enlaces pueden ser útiles para usted:

http://frank.harvard.edu/~coldwell/toolchain/ http://www.microbuilder.eu/Tutorials/SoftwareDevelopment/BuildingGCCToolchain.aspx

Aunque el siguiente enlace es específico de Cortex-M3, puede proporcionar una idea para ti, lo utilizó para la escritura de mi cadena de herramientas de construcción: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

Su newlib puede haber sido miscompiled (tal vez con el compilador de acogida altamente improbable ya que vincula, pero bueno que es posible?).

1

Creo que primero podría escribir un script de shell para elegir el trabajo env, como si trabajara bajo gcc o arm-gcc. En este script, puede crear un enlace lib alternativo a la lib que desee, como si inicia sesión y elige gcc, el archivo lib será libc normal y si elige arm-gcc, la lib será la diferente

Cuestiones relacionadas