Кросс-компиляция 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 

Каждый раз, когда я пытаюсь запустить «Привет, мир!» Исполняемый файл, он 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. Вернуться к сценарию оболочки …

Solutions Collecting From Web of "Кросс-компиляция GCC с помощью newlib для ARM: как указать параметры GCC, такие как -march?"

Для работы я перекрестно строю для платформы Cortex-M3, и я также использую newlib. Следующие ссылки могут быть полезны для вас:

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

Хотя следующая ссылка специфична для Cortex-M3, она может дать вам некоторую информацию, я использовал ее для написания скриптовой сборки: http://www.johannes-bauer.com/mcus/cortex/?menuid=5

Возможно, ваш новолиб был скомпрометирован (возможно, с компилятором хоста? Очень маловероятно, поскольку он связан, но, возможно, это возможно).

Я думаю, вы могли бы сначала написать сценарий оболочки, чтобы выбрать работу env, например, вы будете работать под gcc или arm-gcc. В этом скрипте вы можете сделать альтернативную ссылку на lib для разных lib, которые вы хотите, например, если вы входите в систему и выбираете gcc, файл lib будет нормальным libc, и если вы выберете arm-gcc, lib будет другим