首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC arm-none-eabi (Codesourcery)和C++例外

GCC arm-none-eabi (Codesourcery)和C++例外
EN

Stack Overflow用户
提问于 2012-08-28 00:42:19
回答 1查看 3.1K关注 0票数 6

我使用Raisonance的Ride7 7/Codesourcery(即一个Sourcery CodeBench Lite)和一个STM32F4板开发一个裸金属人机界面。

我将在这个系统中使用C++异常,但我抛出的任何异常都以写入stderr的“终止称为递归”错误结尾。

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

代码语言:javascript
复制
int main(void)
{
    try {
        throw 1;
    }
    catch (...) {
        printf("caught");
    }
}

我已经尝试过Raisonance和其他解决方案,但没有收到任何可起诉的帮助。

势问题/解决方案1:

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

势问题/解2

我还在binutils/gas中发现了一个bug,这可能是我在这里出现问题的根源(bug.cgi?id=13449)。我一直在尝试用这个补丁构建我自己版本的工具链,但是它正在变成一个自己的项目,而且还没有成功。

问题

我需要在代码中做些什么来使用C++异常,还是这可能是工具链中的一个bug?如果是前者,请详细说明。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-31 01:29:41

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

将其添加到.text部分

代码语言:javascript
复制
*(.eh_frame)

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

代码语言:javascript
复制
.ARM.extab :
{
    *(.ARM.extab* .gnu.linkonce.armextab.*)
} >YourMemory

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

确保该行出现在bss部分中。

代码语言:javascript
复制
*(.bss*)

在此过程中,我遇到了以下有用的资源

  • Support
  • metal:link
  • http://gcc.gnu.org/ml/gcc-help/2011-07/msg00112.html
  • http://www.airs.com/blog/archives/460
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12151397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档