elf文件包含多个节(。eh_frame、.eh_frame_shr)来存储关于必须如何进行堆栈解绑的精确信息。这也是引发异常(。gcc_except_table)。插入内联程序集肯定会破坏这些表。编译器如何处理这个问题?它是解析回内联程序集然后更新表,还是当内联程序集弄乱堆栈时,堆栈展开(以及异常处理)就中断了?
bweufnob1#
插入内联程序集肯定会破坏这些表。的确,它经常 * 做 *(虽然不确定,见下文)。编译器如何处理这个问题?它 * 没有 *。而是由程序集编写器决定是否不修改帧寄存器(其可以是x86_64上的RSP或RBP)并且不执行任何PUSH、POP、CALL或RET指令,或者可选地在内联汇编中提供正确的.cfi描述符(这通常很难做到,因为你不知道编译器在函数的 rest 中会做什么)。
x86_64
PUSH
POP
CALL
RET
.cfi
1条答案
按热度按时间bweufnob1#
插入内联程序集肯定会破坏这些表。
的确,它经常 * 做 *(虽然不确定,见下文)。
编译器如何处理这个问题?
它 * 没有 *。
而是由程序集编写器决定是否不修改帧寄存器(其可以是
x86_64
上的RSP或RBP)并且不执行任何PUSH
、POP
、CALL
或RET
指令,或者可选地在内联汇编中提供正确的.cfi
描述符(这通常很难做到,因为你不知道编译器在函数的 rest 中会做什么)。