2012-05-30 15 views
31

Zbudowałem GCC wraz z newlib na Mac OS X dla celów ARM. Jednak libc.a skompilowano z -fshort-enums i nie chcę tego, ponieważ kiedy kompiluję materiał dla ARM, używam -fno-short-enums. To oczywiście powoduje konflikty:Kompilacja krzyżowa GCC z newlib dla ARM: jak określić opcje GCC, takie jak -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 

Za każdym razem, gdy próbuję uruchomić "Hello, World!" plik wykonywalny, to segfault. Czy to może być powód?

Oto komenda kiedyś skompilować 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 

Aktualizacja:

Dobra, myślę, że zawężony problemu w dół do kombinacji libc newlib i uruchamiania pliki (crt0.o). Próbowałem skompilować aplikację testową z GCC 4.7.0 za pomocą libc.a i plików startowych z Android NDK, i to działało na telefonie podczas kompilacji statycznej. W rzeczywistości zadziałało to, mimo że Ld narzekał ponownie na libgcc używając "zmiennych wymiarów" (tzn. Nie skompilowanych z -fno-short-enums, jak wszystko inne). Moja hipoteza o tym, że "fno-short-enums" jest winowajcą w moich wcześniejszych błędnych plikach binarnych, była nieprawidłowa.

Oto, co działa "arm-linux-EABI"

Binutils i GCC 4.7.0 skompilowany ze źródeł dla docelowego Skonfigurowałem GCC używając --with-newlib (newlib i libgloss w drzewie źródłowym GCC). Tak więc GCC został faktycznie zbudowany z newlib i zainstalowany wraz z newlib, i generuje działające pliki binarne, o ile faktycznie nie łączę się z libc newlib. Obecnie muszę użyć libc z Andoid NDK i jego plików startowych.

Mój skrypt kompilacyjny wygląda mniej więcej tak. Include i ścieżki biblioteki wskazywać na NDK zawiera i 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 

nadal chcę uzyskać pliki binarne skompilowane statycznie z newlib za libc pracy. Powrót do skryptowania powłoki ...

+2

Trudno odpowiedzieć, ale dźwięki są łatwe do przetestowania; czy nie jest łatwo sprawdzić, czy kompilacja hello.c z '-fshort-enums' naprawia awarię? –

+0

Czy rozważałeś pobranie [źródła dla libc.a] (http://www.gnu.org/software/libc/) i skompilowanie go samemu? –

+0

-fshort-enums tłumi ostrzeżenie, ale nadal mam awarię :-( – Synthetix

Odpowiedz

2

Do pracy krzyżowo buduję platformę Cortex-M3, a także używam newlib. Poniższe linki mogą być pomocne dla Ciebie:

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

Chociaż poniższy link jest specyficzna dla Cortex-M3, może ona dostarczyć niektóre wgląd do was, użyłem go do skryptu mojego toolchain kompilacji: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

Twój newlib mogły miscompiled (być może z kompilatora gospodarza wysoce prawdopodobne, ponieważ łączy, ale hej, to możliwe?).

1

Myślę, że najpierw można napisać skrypt powłoki, aby wybrać env pracy, tak jak będziesz pracował pod gcc lub arm-gcc. w tym skrypcie możesz utworzyć alternatywny link do lib, który chcesz, np. jeśli zaloguj się i wybierzesz gcc, plik lib będzie normalną biblioteką libc, a jeśli wybierzesz opcję arm-gcc, będzie to inna wersja:

Powiązane problemy