我使用Raisonance的Ride7 7/Codesourcery(即一个Sourcery CodeBench Lite)和一个STM32F4板开发一个裸金属人机界面。
我将在这个系统中使用C++异常,但我抛出的任何异常都以写入stderr的“终止称为递归”错误结尾。
重现问题的代码:(main.cpp)
int main(void)
{
try {
throw 1;
}
catch (...) {
printf("caught");
}
}我已经尝试过Raisonance和其他解决方案,但没有收到任何可起诉的帮助。
势问题/解决方案1:
我在其他论坛上询问过,他们提到我需要在我的启动程序集文件中调用静态构造来初始化展开表(至少我认为这就是他们所说的),但我不知道如何做到这一点。
势问题/解2
我还在binutils/gas中发现了一个bug,这可能是我在这里出现问题的根源(bug.cgi?id=13449)。我一直在尝试用这个补丁构建我自己版本的工具链,但是它正在变成一个自己的项目,而且还没有成功。
问题
我需要在代码中做些什么来使用C++异常,还是这可能是工具链中的一个bug?如果是前者,请详细说明。
发布于 2012-08-31 01:29:41
经过一些不必要的说服之后,Raisonance终于修改了他们默认的链接器脚本,从而解决了问题。对我来说,发布整个链接器脚本可能是不合法的,但是我们需要知道的是
将其添加到.text部分
*(.eh_frame)添加这些部分(根据您在链接器脚本中设置的内存块命名YourMemory )。我的是闪电)
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} >YourMemory
.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} >YourMemory确保该行出现在bss部分中。
*(.bss*)在此过程中,我遇到了以下有用的资源
https://stackoverflow.com/questions/12151397
复制相似问题