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 ...
Trudno odpowiedzieć, ale dźwięki są łatwe do przetestowania; czy nie jest łatwo sprawdzić, czy kompilacja hello.c z '-fshort-enums' naprawia awarię? –
Czy rozważałeś pobranie [źródła dla libc.a] (http://www.gnu.org/software/libc/) i skompilowanie go samemu? –
-fshort-enums tłumi ostrzeżenie, ale nadal mam awarię :-( – Synthetix