我使用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