LINUX.ORG.RU

как самому собрать arm-none-eabi-gcc

 , ,


0

2

Решил тут в порядке саморазвития поковырять stm32.
Ну и чтобы все было по честному решил начать со сборки своего православного кросс-компилятора.
как выяснилось в интернетах нигде нет вменяемого рецепта приготовления (ну или я не нашел). По сему обращаюсь к обчеству за помошью в сборке.
Что было сделано: делал по этой доке - http://www.kunen.org/uC/gnu_tool.html
Только использовал свежие версии пакетов:
binutils-2.23.2.tar.bz2
gcc-4.8.2.tar.bz2
newlib-1.20.0.tar.gz
gdb-7.6.tar.bz2

Все собралось и установилось.
Нашел на хабре пример для сборки.
Собираю своей поделкой - не собирается (есть подозрение не все ключи указал).
Ругается так:
компиляция проходит, а линковка нет:

make
/usr/bin/arm-none-eabi-gcc mk/misc.o mk/stm32f10x_adc.o mk/stm32f10x_dma.o mk/stm32f10x_exti.o mk/stm32f10x_gpio.o 
mk/stm32f10x_rcc.o mk/stm32f10x_usart.o mk/system_stm32f10x.o mk/startup.o mk/onewire.o mk/usb_desc.o mk/interrupts.o 
mk/usb_prop.o mk/hw_config.o mk/leds.o mk/main.o mk/usb_istr.o mk/usb_pwr.o mk/usb_mem.o mk/otgd_fs_cal.o mk/usb_init.o 
mk/otgd_fs_dev.o mk/usb_sil.o mk/usb_regs.o mk/usb_core.o mk/otgd_fs_pcd.o mk/usb_int.o mk/otgd_fs_int.o -static 
-mcpu=cortex-m3 -mthumb -mthumb-interwork -Wl,--start-group -L/usr/lib/thumb -lc -lg -lstdc++ -lsupc++ -lgcc -lm -Wl,--end-group 
-Xlinker -Map -Xlinker testproject.map -Xlinker -T ./cmsis/stm32f100rb_flash.ld -o testproject -Wl,--gc-sections -Wl,-s
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку 
../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку 
../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку 
../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку 
../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку 
../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку
 ../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку
 ../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку
 ../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку
 ../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
/usr/bin/../lib/gcc/arm-none-eabi/4.8.2/../../../../arm-none-eabi/bin/ld: Оператор контроля BFD (GNU Binutils) 2.23.2 обнаружил ошибку
 ../../../src/binutils-2.23.2/bfd/elf32-arm.c:12334
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
make: *** [testproject] Ошибка 1

Для чистоты эксперимента качнул сборку от mentor (Sourcery CodeBench Lite 2013.05-23) собралось. Качнул еще сборку (не помню где брал, архив называется gcc-arm-none-eabi-4_7-2013q3-20130916-linux.tar.bz2) тоже собралось.

Если ли у кого положительный опыт сборки кросскомпилятора руками?

★★★★

Ответ на: комментарий от anonymous

crosstools-ng

Если ли у кого положительный опыт сборки кросскомпилятора руками
положительный опыт сборки кросскомпилятора руками
опыт сборки кросскомпилятора руками
сборки кросскомпилятора руками
кросскомпилятора руками
руками

yax123 ★★★★ ()
Ответ на: комментарий от anonymous

hex-редакторе его надо с нуля писать.

искрометное чувство юмора

Я хочу разобраться в принципе. Какие именно параметры конфигурирования влияют на конечный результат. Похоже дальнейшая деятельность будет связана с платформами отличными от x86 и не факт, что производитель будет так добр предоставить работающий вариант кросс-коммпиляции.

yax123 ★★★★ ()

Если ли у кого положительный опыт сборки кросскомпилятора руками?

Ни один здоровый человек не станет собирать тулчейн руками, когда есть buildroot. Страшно подумать, чей опыт ты собрался тут слушать.

anonymous ()
Ответ на: комментарий от anonymous

буду всех анонимов считать одним и тем же лицом.

когда есть buildroot

вы уверены в том, что точно понимаете, что значит «arm-none-eabi-» ?

yax123 ★★★★ ()
Ответ на: комментарий от yax123

crosstools-ng как раз и сгенерит тебе скрипт для сборки под любую заданную тобой комбинацию параметров. Именно в нем собранна мудрость поколений о том, как делать кросс-тулчейны, и нигде больше ты этой информации не найдешь. У кого еще учиться, как не у crosstools-ng?

anonymous ()
Ответ на: комментарий от anonymous

crosstools-ng как раз и сгенерит тебе скрипт для сборки под любую заданную тобой комбинацию параметров.

это точно ресурс про красноглазиков с линуксом?

yax123 ★★★★ ()

Я собирал используя параметры как здесь + некоторые конкретные модификации для stm32f1x.

У меня в итоге сохранилось вот это:

binutils:
 sed -i -e 's/@colophon/@@colophon/' -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
 ../configure --target=arm-cm3-eabi --prefix=/home/kosyak/ARM --with-sysroot=/home/kosyak/ARM/arm-cm3-eabi --disable-nls --enable-gold --enable-plugins --enable-lto --disable-werror --disable-multilib --disable-interwork 
 make
 make install
 
GCC stage1:
 patch -N ../gcc/config/arm/t-arm-elf ../../gcc-multilib.patch
 ../configure --target=arm-cm3-eabi --prefix=/home/kosyak/ARM --with-newlib --with-build-time-tools=/home/kosyak/ARM/arm-cm3-eabi/bin \
 --with-sysroot=/home/kosyak/ARM/arm-cm3-eabi --disable-shared --disable-multilib --disable-interwork --disable-nls \
 --enable-poison-system-directories --enable-lto --enable-gold --disable-libmudflap --disable-libgomp \
 --disable-libstdcxx-pch --disable-libunwind-exceptions --without-headers --enable-languages=c
 make all-gcc CFLAGS_FOR_TARGET="-mcpu=cortex-m3 -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize" LDFLAGS_FOR_TARGET="-mcpu=cortex-m3 -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize"
 make install-gcc
 
newlib:
 patch -N ../libgloss/arm/linux-crt0.c ../../newlib-optimize.patch
 patch -N ../newlib/libc/machine/arm/arm_asm.h ../../newlib-lto.patch
 ../configure --target=arm-cm3-eabi --prefix=/home/kosyak/ARM --enable-target-optspace --enable-newlib-reent-small --with-build-time-tools=/home/kosyak/ARM/bin \
 --with-sysroot=/home/kosyak/ARM/arm-cm3-eabi --disable-shared --disable-newlib-supplied-syscalls --disable-multilib \
 --disable-interwork --enable-newlib-io-c99-formats --enable-newlib-io-long-long
 make all CFLAGS_FOR_TARGET="-mcpu=cortex-m3 -mthumb -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize" LDFLAGS_FOR_TARGET="-mcpu=cortex-m3 -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize"
 make install

GCC stage2:
 ../configure --target=arm-cm3-eabi --prefix=/home/kosyak/ARM --with-newlib --with-build-time-tools=/home/kosyak/ARM/arm-cm3-eabi/bin \
 --with-sysroot=/home/kosyak/ARM/arm-cm3-eabi --disable-shared --disable-multilib --disable-interwork --disable-nls \
 --enable-poison-system-directories --enable-lto --enable-gold --disable-libmudflap --disable-libgomp \
 --disable-libstdcxx-pch --disable-libunwind-exceptions --enable-languages=c,c++ --disable-libssp
 make CFLAGS_FOR_TARGET="-mcpu=cortex-m3 -mthumb -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize" LDFLAGS_FOR_TARGET="-mcpu=cortex-m3 -flto -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -Os -DPREFER_SIZE_OVER_SPEED -D__OPTIMIZE_SIZE__ -D__BUFSIZ__=64 -D_REENT_SMALL -fno-unroll-loops -DSMALL_MEMORY -ffast-math -ftree-vectorize"
 make install
 
GDB:
 ../configure --disable-multilib --disable-interwork --target=arm-cm3-eabi --prefix=/home/kosyak/ARM
 make
 make install
Осторожно, lto во все поля, может вызвать некоторые проблемы.

Kosyak ★★★★ ()
Ответ на: комментарий от splinter

c newlib собираешь?

само собой. в два прохода (сначало компелятор, потом уже весь пакет вместе с готовым newlib).

yax123 ★★★★ ()
Ответ на: комментарий от yax123

если не ошибаюсь именно первичный компилятор собирается с опцией --with-newlib

splinter ★★★★★ ()
Ответ на: комментарий от Kosyak

patch -N ../gcc/config/arm/t-arm-elf ../../gcc-multilib.patch

Значит поддержку архитектур надо руками раскаменчивать в t-arm-elf?
Это так задумано или просто костыль?

yax123 ★★★★ ()
Ответ на: комментарий от yax123

Ну ты тупой. Еще раз повторяю - именно в crosstools-ng вся информация и собрана. Хочешь понять, как собирать руками - смотри на crosstools-ng. Нигде больше ты этого знания не найдешь.

anonymous ()
Ответ на: комментарий от yax123

Твоя ошибка - newlib, собери сначала с uclibc, потом уже экспериментируй с newlib.

И да, про crosstool-ng тебе правильно говорят. Хотя бы патчи ихние посмотри, они не просто так писаны.

Dark_SavanT ★★★★★ ()
Последнее исправление: Dark_SavanT (всего исправлений: 1 )
Ответ на: комментарий от anonymous

Ну ты тупой

ви делаете мине смишно :)))
странное упорство проповедовать мысль, что только автор(ы) crosstools-ng
владеет(ют) исключительными правами на знание тонкостей настройки кросскомпиляции.


Но он только «му» да «му»,
А к чему, почему -
Не пойму!

- Повесьте, пожалуйста, трубку!

yax123 ★★★★ ()

Часто бывает что версия binutils не всегда корректно работает с какой либо версией gcc, сам на это натыкался. Гугли в общем.

splinter ★★★★★ ()
Ответ на: комментарий от Dark_SavanT

Я avr тулчейн собирал

есть мнение, что для avr тулчейн несколько проще хотя бы тем, что система команд одна.

в общем нужна полная поддержка stm32f0xx/1xx/3xx/4xx и stm32l1xx

yax123 ★★★★ ()
Ответ на: комментарий от splinter

Часто бывает что версия binutils не всегда корректно работает с какой либо версией gcc

насчет binutils посмотрю, возможно действительно моя комбинация версий не рабочая (как минимум gcc-4.5.2 не собирается с newlib-1.20.0).

тогда еще вопрос: насколько корректно по моей сцилке не указание конкретной архитектуры?

yax123 ★★★★ ()
Ответ на: комментарий от yax123

А вот черт его знает, я тоже удивлялся когда собирал. Похоже на костыль.

Kosyak ★★★★ ()
Ответ на: комментарий от yax123

что только автор(ы) crosstools-ng владеет(ют) исключительными правами на знание тонкостей настройки кросскомпиляции.

Именно так. Там собраны все знания, которые человечество накопило по этой теме. Нигде больше ты их все в одном месте не найдешь.

anonymous ()
Ответ на: комментарий от Dark_SavanT

Тада ему и newlib не нужен толком.

Почему бы и нет? Это авр мелкий и БЕЗНОГNМ, а на армах уже можно и malloc'ом развлекатся и printf'ами всякими.

Kosyak ★★★★ ()
Ответ на: комментарий от splinter

и дал ту же ссылку что и ТС.

Да - мне очень стыдно что я весь бред до конца не прочитал :)

anonymous ()

Возьми гентушный пакет.

Anon ()

В общем, излазив все ембедерские помойки пришел к выводу, что нельзя просто взять и собрать кросскомпилятор.

Все более-менее успешные сборки в исходниках содержат больше чем 4 архива исходников (binutils, gcc, newlib, gdb). Что лично для меня является выходом за пределы зоны комфорта. А так как сборка кросскомпилятора это все таки не самоцель, а средство, решил воспользоваться готовыми решениям (а разбор того как это собрать руками оставить на потом).
Всего нашлись 3 варианта:
1) поделку от mentor
2) пакет с сайта https://launchpad.net/gcc-arm-embedded
3) ну и так любимый анонимусом crosstool-ng (можно подумать я про него до своего вопроса не знал)

Вариант 2 можно качнуть в виде бинарной сборки, есть пакет сырцов для самостоятельного красноглазия.
собирается относительно легко, но судя по всему заточен под убунту, поэтому ищет какой-то дурацкий pdf-ник.
Беспощадный закомент 3-х строк в скрипте решает этот вопрос кардинально.
Вариант 1 тоже доступен в бинарном виде и даже есть пакет с исходниками. Исходники у меня не собрались там какой-то уж очень странный скрипт сборки (явно сгенерен другим скриптом, а тот в свою очередь еще одним).
Вариант 3 вот уже полчаса как пытается собраться так, что ничего про него не скажу.

Попытки собрать один и тот же проект вариантами 1 и 2 выдал любопытную информацию:
В первом случае elf/бинарь имеет размер 66452/20228
Во втором 67584/24684
почти 20%. Так что наверно mentor не врал рассказывая про хитрые оптимизации.

Так шта остановлюсь пока на варианте 1. Вариант 2 будет в запасе (еще надо будет сравнить, а что из всего этого будет работоспособным на реальном железе).
А -ng просто один раз протестирую, что-то мне подсказывает, что результат будет не лучше варианта 2.

yax123 ★★★★ ()
Ответ на: комментарий от yax123

P.S. ng собрался, но скомпелять проект не смог. Похоже нужна более тонкая неочевидная настройка. Таким образом вариант 3 выбывает из списка.

yax123 ★★★★ ()
Последнее исправление: yax123 (всего исправлений: 1 )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.