Я собрал 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. Вернуться к сценарию оболочки …
Для работы я перекрестно строю для платформы 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 будет другим