在每一行之后似乎都有一个.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
我没有达到这些目的。
答案 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
。