android c macos gcc arm

android - Compilación cruzada de GCC con newlib para ARM: cómo especificar opciones de GCC como-march?



macos (2)

Creo que primero podrías escribir un script de shell para elegir el trabajo env, como si trabajases bajo gcc o arm-gcc. en esta secuencia de comandos, puede hacer un enlace alternativo a otra biblioteca que desee, como si inicia sesión y elige gcc, el archivo lib será normal y si elige arm-gcc, la biblioteca será la diferente

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:

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 trato de ejecutar un "¡Hola mundo!" ejecutable, segfaults. Podría ser ésta la razón?

Aquí está el comando que utilicé para compilar hello.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

Actualizar:

De acuerdo, creo que reduje el problema a la combinación de la libc de newlib y los archivos de inicio (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 ld se quejó nuevamente de que libgcc usaba "enumeraciones de tamaño variable" (es decir, no compiladas 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 funciona:

Binutils y GCC 4.7.0 compilados desde el origen para el objetivo "arm-linux-eabi". Configuré GCC usando --with-newlib (newlib y libgloss en el árbol fuente de GCC). Por lo tanto, GCC se construyó realmente con newlib y se instaló junto con newlib, y genera binarios de trabajo siempre y cuando no se vincule con libc de newlib. En la actualidad, debo usar libc desde el NDK de Andoid y sus archivos de inicio.

Mi script de compilación se ve algo como esto. Las rutas de inclusión y de biblioteca apuntan a los incluidos y libc de NDK:

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 obtener binarios compilados estáticamente con el funcionamiento de newlib libc. Volver a las secuencias de comandos de shell ...


Para el trabajo, realizo una compilació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 proporcionarle alguna información, lo usé para crear un script de mi cadena de herramientas: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

Su newlib puede haber sido mal compilado (tal vez con el compilador de host? Altamente improbable ya que enlaza, pero bueno, es posible).