Gnu Assembler(GAS)中的CFI指令用于什么?

时间:2010-03-27 12:06:58

标签: assembly gas

在每一行之后似乎都有一个.CFI指令,而且这些ex。,.cfi_startproc.cfi_endproc等等都有很多变种。more here

    .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

我没有达到这些目的。

4 个答案:

答案 0 :(得分:136)

要禁用它们,请使用gcc选项

-fno-asynchronous-unwind-tables

注意,我知道这是一个非常古老的主题,但这是google for cfi_startproc的最高结果,因此很多人可能会来这里禁用该输出。


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

答案 1 :(得分:64)

我感觉它代表Call Frame Information并且是GNU AS扩展来管理调用帧。来自DeveloperWorks

  

在某些架构上,例外   必须使用Call管理处理   帧信息指令。这些   指令在程序集中使用   直接异常处理。这些   指令在Linux上可用   POWER,如果出于任何原因(便携性)   例如,代码库,   GCC生成了异常处理   信息不充分。

看起来这些是在某些平台上生成的,具体取决于异常处理的需要。

如果您要停用这些内容,请参阅David's answer

答案 2 :(得分:25)

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

调试器可以通过使用堆栈指针(%rsp)和寄存器%rbp来展开此堆栈,但是它需要知道如何找到它们。这就是CFI指令的用武之地。

movq    %rsp, %rbp
.cfi_def_cfa_register 6

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

答案 3 :(得分:3)

要禁用这些功能,只要您不使用异常,g ++就需要-fno-exceptions和前面提到的-fno-asynchronous-unwind-tables