J'ai compilé GCC avec newlib sur Mac OS X pour les cibles ARM. Cependant, la libc.un a été compilé avec -fshort-enums, et je n'en veux pas, parce que quand je compile des trucs pour les BRAS, j'ai utiliser -fno-court-enums. Ce conflit, bien sûr:
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
Chaque fois que j'essaie de lancer un "Bonjour, Monde!" exécutable, il segmentation. Serait-ce la raison?
Voici la commande que j'ai utilisé pour compiler bonjour.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
Mise à jour:
D'accord, je pense que j'ai limité le problème de la combinaison de newlib de la libc et les fichiers de démarrage (crt0.o). J'ai essayé de compiler une application de test avec GCC 4.7.0 à l'aide de la libc.un et fichiers de démarrage à partir de l'Android NDK, et qui a travaillé sur le téléphone lors de la compilation statique. En fait, cela a fonctionné, même si ld se sont plaints de nouveau sur libgcc à l'aide de "de taille variable, les énumérations" (c'est à dire, pas compilé avec-fno-court-les énumérations, comme tout le reste). Donc, mon hypothèse sur -fno-court-enums être le coupable dans mon précédent s'écraser les fichiers binaires était incorrecte.
Voici ce qui est à travailler:
Binutils et GCC 4.7.0 compilé à partir des sources pour cible "arm-linux-eabi." Je l'ai configuré à l'aide de GCC --with-newlib (newlib et libgloss dans l'arborescence des sources de GCC). Donc, GCC a été construit avec newlib et installé avec newlib, et il génère de travail binaires longtemps que je n'ai pas vraiment de lien avec newlib de la libc. À l'heure actuelle, je dois utiliser la libc de l'Android NDK et de ses fichiers de démarrage à la place.
Mon compiler le script ressemble à quelque chose comme ça. L'inclure et de la bibliothèque des chemins de point pour le NDK comprend et libc:
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
Je veux encore pour obtenir des binaires compilés statiquement avec newlib de la libc de travail. Retour à la création de scripts shell...