Gnu 汇编器 (GAS) 中的 CFI 指令有何用途?

问题描述 投票:0回答:4

每行后面似乎都有一个 .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

我不明白这些的目的。

assembly callstack gnu-assembler stack-unwinding debug-information
4个回答
154
投票

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

-fno-asynchronous-unwind-tables

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


78
投票

我有一种感觉,它代表“呼叫帧信息”,是管理呼叫帧的 GNU AS 扩展。来自 DeveloperWorks

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

看起来这些是在某些平台上根据异常处理的需要生成的。

如果您想禁用这些功能,请参阅

David 的回答


35
投票

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

movq %rsp, %rbp .cfi_def_cfa_register 6

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


4
投票
-fno-exceptions

以及前面提到的

-fno-asynchronous-unwind-tables
,前提是您不使用异常。
    

© www.soinside.com 2019 - 2024. All rights reserved.