GCC arm-none-eabi (Codesourcery) и исключения C++

Я использую Ride7/Codesourcery от Raisonance (также называемый Sourcery CodeBench Lite) с платой STM32F4, которая разрабатывает платформу HMI для "голого металла".

Я буду использовать исключения C++ в этой системе, но любое исключение, которое я выбрасываю, заканчивается ошибкой "Завершить рекурсивно", записанной в stderr.

Код для воспроизведения проблемы: (main.cpp)

int main(void)
{
    try {
        throw 1;
    }
    catch (...) {
        printf("caught");
    }
}

Я уже испробовал Raisonance и другие источники для разрешения и не получил никакой действенной помощи.

Потенциальная проблема / решение 1:

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

Потенциальная проблема / решение 2

Я также обнаружил ошибку в binutils/gas, которая может быть источником моих проблем здесь ( http://sourceware.org/bugzilla/show_bug.cgi?id=13449). Я пытался создать свою собственную версию набора инструментов с помощью этого патча, но он превращается в собственный проект, но пока не увенчался успехом.

Вопрос

Нужно ли что-то делать в коде, чтобы использовать исключения C++, или это скорее всего ошибка в наборе инструментов? Если первое, пожалуйста, уточните.

1 ответ

Решение

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

Добавьте это в раздел.text

*(.eh_frame)

Добавьте эти разделы (назовите YourMemory в соответствии с блоками памяти, которые вы установили в своем скрипте компоновщика. Мой был Flash)

.ARM.extab :
{
    *(.ARM.extab* .gnu.linkonce.armextab.*)
} >YourMemory

.ARM :
{
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
} >YourMemory

Убедитесь, что эта строка находится в разделе bss

*(.bss*)

Во время этого квеста я наткнулся на следующие полезные ресурсы

Другие вопросы по тегам