Кросс-компиляция GCC с newlib для ARM: как указать параметры GCC, такие как -march?

Я скомпилировал GCC вместе с newlib в Mac OS X для целей ARM. Однако libc.a был скомпилирован с параметром -fshort-enums, а мне это не нужно, потому что при компиляции для ARM я использую параметр -fno-short-enums. Это конфликтует, конечно:

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

Каждый раз, когда я пытаюсь запустить "Hello, World!" исполняемый, он segfaults. Может ли это быть причиной?

Вот команда, которую я использовал для компиляции 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

Обновление:

Хорошо, я думаю, что сузил проблему до комбинации libc newlib и файлов запуска (crt0.o). Я попытался скомпилировать тестовое приложение с GCC 4.7.0, используя libc.a и файлы запуска из Android NDK, и это работало на телефоне при статической компиляции. На самом деле это сработало, несмотря на то, что ld снова жаловался на то, что libgcc использует «перечисления переменного размера» (т. е. не скомпилирован с -fno-short-enums, как все остальное).Итак, моя гипотеза о том, что -fno-short-enums является виновником моих предыдущих аварийных двоичных файлов, была неверной.

Вот что работает:

Binutils и GCC 4.7.0, скомпилированные из исходного кода для цели «arm-linux-eabi». Я настроил GCC, используя --with-newlib (newlib и libgloss в исходном дереве GCC). Таким образом, GCC был фактически собран с newlib и установлен вместе с newlib, и он генерирует рабочие двоичные файлы, пока я на самом деле не связываюсь с libc newlib. В настоящее время я должен вместо этого использовать libc из Andoid NDK и его файлы запуска.

Мой сценарий компиляции выглядит примерно так. Пути включения и библиотеки указывают на включения NDK и 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

Я все еще хочу, чтобы бинарные файлы скомпилировались статически с работающей libc newlib. Назад к сценариям оболочки...

31
задан Synthetix 31 May 2012 в 09:50
поделиться