LINUX.ORG.RU

avr-gcc и distcc

 , , ,


0

1

Пользуюсь Debian Stable, в нем avr-gcc версии 4.8.1, при сборке с -flto он сыпет варнингами и прошивка в итоге работает криво или вообще не работает. Завел Debian Testing в виртуалке, там версия 4.9.2, он с -flto работает нормально. Поднял в этой виртуалке distcc, чтобы собирать бинари из под основной системы более свежим компилятором. Все вроде работает, пока не использовать -flto. Со включенным -flto линкер завершается с ошибкой. На сколько я понял, удалённо происходит только компиляция, а линковка локально, т.е. собранные компилятором 4.9.2 объектники потом линкуются 4.8.1. Можно ли как-то заставить distcc линковку производить тоже удалённо? Может тут надо что-то другое, а не distcc?

★★★★

Почему бы не установить новый компилятор в основную систему?

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

Можно, но мне лень) Заодно с distcc разберусь, коли уж есть повод.

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

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

sudopacman ★★★★★ ()

Debian Stable

Завел Debian Testing в виртуалке

Прочитай про systemd-nspawn и chroot. С помощью debootstrap мутишь окружение с нужной версией системы и с помощью systemd-nspawn «загружаешь» его. Будет тебе окружение с нужной версией компилятора и без геморроя с доступом к файлам. Еще туда можно ssh поставить и настроить запуск контейнера при загрузке системы.

По крайней мере я сам так делал, когда для экспериментов cmake свежий понадобился.

Radjah ★★★★★ ()

Для -flto нужно добавить атрибут used к таблице векторов. Это единственная проблема, которая точно есть.

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

А можно поподробнее с этого момента? Предупреждения gcc касались как раз прерываний.

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

Для ARM-ов, где таблица прерываний в пользовательском коде, я делаю так:

__attribute__ ((used, section(".vectors")))
void (* const vectors[])(void) =
{
  &_stack_top,                   // 0 - Initial Stack Pointer Value

  // Cortex-M0+ handlers
  irq_handler_reset,             // 1 - Reset
  irq_handler_nmi,               // 2 - NMI
........

Для AVR скорее всего придется менять скрипт линкера, так как сама таблица в бинарных библиотеках. Если я не ошибаюсь, то таблица векторов в скрипте объявлена с KEEP(), но линкер это игнорирует при -flto (это вроде баг, так что от версии будет зависеть).

И скорее всего придется делать свою копию таблицы векторов и указывать правильные атрибуты. Это нужно смотреть как оно там сделано, я уже не помню точно.

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

Мне ни разу не удалось собрать gcc на Debian из-за непонятных проблем с каким-то барахлом.

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

Теперь еще и тулчейны через systemd будем разворачивать? Дожили.

anonymous ()

Попробовал воспроизвести на gcc version 4.9.2 (AVR_8_bit_GNU_Toolchain_3.5.3_1700) и все работает как нужно.

Так что нужно смотреть на конкретные ошибки и решать на месте.

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

Можно и docker. Еще один init всяко легче еще одного ядра. Неймспейсы и в Африке неймспейсы.

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

А, ну если в дебиане нельзя просто так взять и обновить версию компилятора до актуальной, то можно сделать контейнер.

sudopacman ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.