Подтвердить что ты не робот

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

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. Вернемся к сценариям оболочки...

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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