gcc C++内联汇编如何与堆栈展开和异常处理一起工作?

r8xiu3jd  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(138)

elf文件包含多个节(。eh_frame、.eh_frame_shr)来存储关于必须如何进行堆栈解绑的精确信息。这也是引发异常(。gcc_except_table)。插入内联程序集肯定会破坏这些表。
编译器如何处理这个问题?它是解析回内联程序集然后更新表,还是当内联程序集弄乱堆栈时,堆栈展开(以及异常处理)就中断了?

bweufnob

bweufnob1#

插入内联程序集肯定会破坏这些表。
的确,它经常 * 做 *(虽然不确定,见下文)。
编译器如何处理这个问题?
它 * 没有 *。
而是由程序集编写器决定是否不修改帧寄存器(其可以是x86_64上的RSP或RBP)并且不执行任何PUSHPOPCALLRET指令,或者可选地在内联汇编中提供正确的.cfi描述符(这通常很难做到,因为你不知道编译器在函数的 rest 中会做什么)。

相关问题