Мое целевое устройство - это устройство на основе EFM32 Cortex-M3.Мой набор инструментов - официальный набор инструментов ARM GNU gcc-arm-none-eabi-8-2018-q4-major.
Все отлично работает без LTO, но чтобы заставить LTO работать, я должен пометить весь код обработчика прерываний-fno-lto
.Я хотел бы избавиться от этого обходного пути.
Проблема в том, что каждый обработчик прерываний удаляется из окончательного двоичного файла.(Я проверяю с помощью arm-none-eabi-nm --print-size --size-sort --radix=d -C -n file.out
) Это приводит к бинарному сбою.
Копаем глубже и после поиска в Google похожих проблем:
Пример кода из startup_efm32gg.c
определяет обработчики прерываний по умолчанию следующим образом:
void DMA_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
/* many other interrupts */
void Default_Handler(void) { while (1); }
Та же проблема возникает и для обычных определений обработчиков прерываний (например, без псевдонимов и не слабых)
Возможно, это связано, но кажетсячто слабые символы ведут себя неправильно в режиме LTO таким же образом.
Заранее спасибо за любые идеи!
Редактировать: Смотрите мой ответ на помеченный ответ для полного решения!