Я собрал 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
Update:
Хорошо, я думаю, что я сузил проблему до комбинации newlib libc и файлов запуска (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, и он генерирует рабочие двоичные файлы до тех пор, пока я фактически не ссылаюсь на newlib libc. В настоящее время я должен использовать libc из Andoid NDK и его файлов запуска.
Моя компиляция script выглядит примерно так. Пути включения и библиотеки указывают на 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
Я все еще хочу, чтобы двоичные файлы были скомпилированы статически при работе с newlib libc. Вернемся к сценариям оболочки...