You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

throw块与着陆垫分属不同节时,C++异常处理是否生效?

C++异常处理:throw代码块与着陆垫分属不同section时的兼容性问题

结论先行:C++标准并未限制throw代码块和着陆垫必须处于同一section,理论上异常处理应当正常工作,但实际能否运行取决于编译器、链接器的实现细节以及 unwind 机制的配置。

针对你给出的案例:当自定义链接器将array::foo()放入.text._ZN5array3fooEv节,其余代码在.text节时,程序崩溃并触发_URC_END_OF_STACK错误、搜索阶段找不到处理程序,但LLVM ld.lld将所有代码合并到.text时正常,问题出在链接器对特殊命名section的处理上:

  • 异常 unwind 机制(比如DWARF unwind信息)依赖编译器生成的栈展开数据,这些数据需要与代码所在的section正确绑定。如果链接器默认只处理.text节的unwind信息,对于像.text._ZN5array3fooEv这类命名特殊的text section,若未显式配置,可能会忽略其对应的unwind数据,导致unwinder在栈展开时无法追踪到throw点对应的catch块。
  • 部分链接器在处理分散的text section时,可能没有正确合并或关联unwind段的信息,使得unwinder无法遍历到着陆垫所在的section。

可行的解决方向:

  • 调整链接器配置,确保所有包含执行代码的text section都被纳入unwind信息的处理流程。
  • 通过链接器选项强制将所有text section合并到.text中,复刻ld.lld的默认行为,避免section拆分引发的问题。
  • 用readelf或objdump工具查看目标文件的DWARF unwind段,验证array::foo()对应的unwind数据是否存在且关联正确。

内容的提问来源于stack exchange,提问作者Kishan Parmar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:55:02