elf 文件包含多个部分(.eh_frame、.eh_frame_shr)以存储有关如何完成堆栈展开的精确信息。这也是抛出异常的基础(.gcc_except_table)。插入内联汇编肯定会弄乱这些表。
编译器是如何处理的?它是解析回内联程序集然后更新表还是将堆栈展开(因此也是异常处理)只是在内联程序集弄乱堆栈时中断?
插入内联汇编肯定会弄乱这些表。
是的,而且它经常确实(虽然不确定,见下文)。
编译器是如何处理的?
它不.
相反,由汇编程序编写器决定不修改帧寄存器(在
x86_64
上可以是 RSP 或 RBP)并且不执行任何 PUSH
、POP
、CALL
或 RET
指令,或者在内联汇编中提供正确的.cfi
描述符(这通常很难做到)。