31 votes

Cross compilation GCC avec newlib pour ARM: comment spécifier les options GCC telles que -march?

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

2voto

chmeee Points 2777

Pour le travail j'ai de la croix-construire pour le Cortex-M3 plate-forme, et j'ai aussi utiliser newlib. Les liens suivants peuvent vous être utiles:

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

Bien que le lien suivant est spécifique à Cortex-M3, il peut fournir un aperçu pour vous, je l'ai utilisé pour mon script de la chaîne de build: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

Votre newlib peut avoir été miscompiled (avec peut-être l'hôte du compilateur? Très peu probable, car il des liens, mais bon c'est possible).

1voto

How Chen Points 399

Je pense que vous pourriez d’abord écrire un script shell pour choisir le travail env, comme si vous travailliez sous gcc ou arm-gcc. dans ce script, vous pouvez créer un lien alternatif avec la bibliothèque que vous voulez, comme si vous vous connectiez et que vous choisissez gcc, le fichier lib sera une libc normale et si vous choisissez arm-gcc, la lib sera différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X