Gnu汇编程序(GAS)中的CFI指令是什么?

在每一行之后似乎都有一个.CFI指令,而且这些.cfi_startproc.cfi_endproc.cfi_endproc等也有很多.cfi_endproc

  .file "temp.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl $0, %eax leave ret .cfi_endproc .LFE0: .size main, .-main .globl func .type func, @function func: .LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movl %esi, %eax movb %al, -8(%rbp) leave ret .cfi_endproc .LFE1: .size func, .-func .ident "GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1" .section .note.GNU-stack,"",@progbits 

我没有得到这些的目的。

我有一个感觉它代表呼叫帧信息 ,是一个GNU AS扩展来pipe理呼叫帧。 来自DeveloperWorks :

在一些体系结构中,exception处理必须通过调用帧信息指令进行pipe理。 这些指令在汇编中用于指导exception处理。 如果出于任何原因(例如代码库的可移植性),这些指令在Linux on POWER上可用,则GCC生成的exception处理信息是不够的。

它看起来像是在一些平台上生成的,这取决于是否需要exception处理。

如果你想禁用这些,请参阅David的回答 。

要禁用这些,请使用gcc选项

 -fno-asynchronous-unwind-tables 

请注意,我知道这是一个非常古老的线程,但是这是Google对于cfi_startproc的最高结果,所以很多人可能会来这里禁用该输出。


-fno-dwarf2-cfi-asm也可能需要。

CFI指令用于debugging。 它允许debugging器展开堆栈。 例如:如果程序A调用程序B,程序B然后调用一个通用程序C.程序C失败。 你现在想知道谁实际上叫C,然后你可能想知道谁叫B.

debugging器可以通过使用堆栈指针(%rsp)并注册%rbp来展开这个堆栈,但是它需要知道如何find它们。 这就是CFI指令进来的地方。

 movq %rsp, %rbp .cfi_def_cfa_register 6 

所以这里的最后一行告诉它“呼叫帧地址”现在在寄存器6(%rbp)

    Interesting Posts