gcc如何在Linux上实现堆栈展开C++异常?

Geo*_*ing 18 c++ gcc exception

gcc如何在Linux上实现堆栈展开C++异常?特别是,它如何知道在展开帧时要调用哪些析构函数(即,存储什么类型的信息以及存储在何处)?

小智 12

请参见x86_64 ABI的 6.2节.这详细介绍了界面,但没有详细介绍很多底层数据.这也独立于C++,可以想象也可以用于其他目的.

由gcc发出的ELF二进制文件主要有两个部分,它们对异常处理很感兴趣.他们是.eh_frame.gcc_except_table.

.eh_frame遵循DWARF格式(主要在您使用gdb时发挥作用的调试格式).它与.debug_frame编译时发出的部分格式完全相同-g.本质上,它包含在调用堆栈上方的任何位置回弹到机器寄存器状态和堆栈所需的信息.有关详细信息,请参阅dwarfstd.org上的Dwarf Standard.

.gcc_except_table包含有关异常处理"登陆垫"处理程序位置的信息.这是必要的,以便知道何时停止展开.不幸的是,这部分没有很好的记录.我能够收集的唯一信息片段来自gcc邮件列表.特别参见这篇文章

剩下的信息就是实际代码解释这些数据部分中的信息.相关代码存在于libstdc ++和libgcc中.我现在记不清哪些作品在哪里.可以在文件gcc/unwind-dw.c中的gcc源代码中找到DWARF调用帧信息的解释器.