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


118

有似乎是一个.CFI指令,每行后,也有广泛的这些前的品种繁多,.cfi_startproc.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

我没有达到这些目的。


3
这里cfi指令说明GNU AS
Paschalis 2015年

相关:如何从GCC / c装配件输出中消除“噪音”?,如果您只想要没有指令的指令。一种不错的方法是将您的代码放在gcc.godbolt.org上,以查看各种编译器(包括非x86)的不同版本的经过过滤的asm输出,并用颜色突出显示以将源代码行与asm块匹配。
彼得·科德斯

Answers:


70

我有一种感觉,它代表呼叫帧信息,是GNU AS扩展,用于管理呼叫帧。从DeveloperWorks

在某些体系结构上,必须使用“调用框架信息”指令来管理异常处理。这些伪指令在程序集中用于指导异常处理。如果出于某种原因(例如,代码库的可移植性),GCC生成的异常处理信息不足,则这些指令在Linux on POWER上可用。

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

如果您要禁用这些功能,请参阅David的答案


5
您还可以说一句有关.LFB0,.LFB1,.LFE0,.LFE1的字词吗
抓住了

@claws-这些是编译器生成的标签(如您所见:)。参见stackoverflow.com/a/15285058/4294399
Calculuswhiz


30

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

调试器可以通过使用堆栈指针(%rsp)并注册%rbp来展开此堆栈,但是它需要知道如何查找它们。这就是CFI指令出现的地方。

movq    %rsp, %rbp
.cfi_def_cfa_register 6

因此,这里的最后一行告诉它“呼叫帧地址”现在位于寄存器6(%rbp)中


2
我认为,cfi的异常处理使用应该比调试更频繁。
osgx 2014年

6
实际上,CFA代表“规范帧地址”。看这里
卡梅伦


1
CFI指令甚至允许使用编译的代码展开堆栈-fomit-frame-pointer,以替代RBP(默认情况下使用gcc或clang -O1及更高版本启用该功能)。C ++异常处理以及调试器/分析器使用它。在具有传统RBP帧指针的代码中,当前RBP值始终指向已保存的RBP值,并且指向先前的RBP值,形成链接列表。在这种情况下,不需要CFI。(尽管在使用帧指针的函数中,CFI cfa_register避免了每次RSP更改都需要更多元数据,如您所显示的。)
Peter Cordes

2

要禁用这些功能,g ++的需求-fno-exceptions以及前面提到的-fno-asynchronous-unwind-tables,前提是您不使用异常。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.