GCC arm-none-eabi(Codesourcery)和C++ Exceptions

Ver*_*rax 6 c++ gcc arm exception codesourcery

我正在使用Raisonance的Ride7/Codesourcery(又名Sourcery CodeBench Lite)和STM32F4开发裸机HMI平台.

我将在这个系统中使用C++异常,但是我抛出的任何异常都以写入stderr的"Terminate called recursively"错误结束.

重现问题的代码:(main.cpp)

int main(void)
{
    try {
        throw 1;
    }
    catch (...) {
        printf("caught");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过Raisonance和其他来源的解决方案,并且没有收到任何可行的帮助.

潜在问题/解决方案1:

我已经在其他论坛上问过,他们提到我需要在我的启动程序集文件中调用静态构造来初始化展开表(至少这是我认为他们正在讨论的内容),但我不知道如何做到这一点.

潜在问题/解决方案2

我还发现了binutils/gas中的一个错误,可能是我的问题的根源(http://sourceware.org/bugzilla/show_bug.cgi?id=13449).我一直在尝试使用这个补丁来构建我自己的工具链版本,但这已经变成了自己的项目,并且还没有成功.

问题

我是否需要在代码中执行某些操作才能使用C++异常,或者这可能是工具链中的错误?如果是前者,请详细说明.

Ver*_*rax 2

经过一番不必要的劝说后,Raisonance 最终修改了默认链接器脚本,解决了问题。对我来说发布整个链接器脚本可能不合法,但这是人们需要知道的知识

将其添加到 .text 部分

*(.eh_frame)
Run Code Online (Sandbox Code Playgroud)

添加这些部分(根据您在链接器脚本中设置的内存块命名YourMemory 。我的是Flash

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

.ARM :
{
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
} >YourMemory
Run Code Online (Sandbox Code Playgroud)

确保此行出现在 bss 部分

*(.bss*)
Run Code Online (Sandbox Code Playgroud)

在这个任务中,我遇到了以下有用的资源