2012-05-30 20 views
31

Ho compilato GCC con newlib su Mac OS X per obiettivi ARM. Comunque, libc.a è stato compilato con -fshort-enums, e non lo voglio perché quando compilo roba per ARM, uso -fno-short-enum. Questo conflitto, naturalmente:Cross compilazione GCC con newlib per ARM: come specificare le opzioni GCC come -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 

Ogni volta che tenta di eseguire un "Ciao, mondo!" eseguibile, segfaults. Potrebbe essere questa la ragione?

Ecco il comando che ho usato per compilare 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 

Aggiornamento:

Va bene, penso che ho ristretto il problema fino alla combinazione di libc di newlib e l'avvio file (crt0.o). Ho provato a compilare un'applicazione di test con GCC 4.7.0 utilizzando libc.a e i file di avvio da NDK Android, e questo ha funzionato sul telefono quando compilato statico. In effetti, ha funzionato anche se mi sono lamentato di nuovo su libgcc usando "enum di dimensione variabile" (cioè, non compilato con enfasi -fno-brevi come tutto il resto). Quindi, la mia ipotesi sul fatto che le enfetamine fossero il colpevole dei miei precedenti binari in crash era errata.

Ecco che cosa sta funzionando: "arm-linux-EABI"

Binutils e GCC 4.7.0 compilata dai sorgenti per destinazione Ho configurato GCC usando --with-newlib (newlib e libgloss nell'albero dei sorgenti di GCC). Quindi, GCC è stato in realtà creato con newlib e installato insieme a newlib, e genera binari funzionanti a patto che non si colleghi effettivamente alla libc di newlib. Al momento, devo usare libc da Andoid NDK e dai suoi file di avvio.

Il mio script di compilazione è simile a questo. Il comprendono e puntare i percorsi di libreria al NDK include e 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 

ho ancora voglia di ottenere binari compilati staticamente con lavoro libc di newlib. Torna allo script della shell ...

+2

Difficile rispondere ma sembra facile da testare; non è abbastanza facile testare se compilare hello.c con '-fshort-enums' corregge l'arresto? –

+0

Hai pensato di scaricare [la fonte per libc.a] (http://www.gnu.org/software/libc/) e compilarlo da solo? –

+0

-fshort-enums sopprime l'avviso, ma ho ancora un arresto :-( – Synthetix

risposta

2

Per il lavoro di cross-build per la piattaforma Cortex-M3, e uso anche newlib. I seguenti link possono essere utili per voi:

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

Sebbene il seguente link è specifico per Cortex-M3, può fornire una certa comprensione per te, l'ho usato per il mio script di toolchain costruzione: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

tuo newlib potrebbe essere stato miscompiled (magari con il compilatore di accoglienza altamente improbabile poiché si collega, ma hey è possibile?).

1

Penso che potresti scrivere uno script di shell per scegliere l'ambiente di lavoro, come se lavorassi sotto gcc o arm-gcc. in questo script, potresti creare un lib link alternativo alla lib desiderata, ad esempio se accedi e scegli gcc, il file lib sarà normale libc e se scegli arm-gcc, il lib sarà diverso

Problemi correlati