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



我使用Raisonance的Ride7/Codesourcery(又名Sourcery CodeBench Lite)和STM32F4板开发裸金属HMI平台。

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

重现问题的代码:(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++异常,或者这可能是工具链中的一个错误?如果是前者,请详细说明。

经过一些本不必要的说服,Raisonance终于修改了他们的默认链接器脚本,解决了这个问题。对我来说,发布整个链接器脚本可能是不合法的,但以下是需要了解的知识

将此添加到.text部分

*(.eh_frame)

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

.ARM.extab :
{
    *(.ARM.extab* .gnu.linkonce.armextab.*)
} >YourMemory
.ARM :
{
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
} >YourMemory

确保该行出现在bss部分中

*(.bss*)

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

  • http://wiki.osdev.org/C%2B%2B_Exception_Support
  • https://docs.blackfin.uclinux.org/doku.php?id=toolchain:bare_metal:link
  • http://gcc.gnu.org/ml/gcc-help/2011-07/msg00112.html
  • http://www.airs.com/blog/archives/460

最新更新