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

时间:2012-08-28 00:42:20

标签: c++ exception gcc arm codesourcery

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

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

重现问题的代码: (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 个答案:

答案 0 :(得分:2)

经过一些不必要的说服之后,Raisonance最终修改了修复问题的默认链接描述文件。发布整个链接描述文件对我来说可能不合法,但是这里需要知道的知识

将其添加到.text部分

*(.eh_frame)

根据您在链接描述文件中设置的内存块添加这些部分(名称​​ YourMemory 。我的 Flash

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

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

确保此行出现在bss部分

*(.bss*)

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