gpt4 book ai didi

c++ - GCC 从 c++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

转载 作者:IT老高 更新时间:2023-10-28 12:41:08 34 4
gpt4 key购买 nike

我有以下 c++ 代码

int factorial(int n){

if(n==0){
return 1;
}
return n*factorial(n-1);

}

int main(void){
factorial(5);
return 0;
}

当我使用 g++ -S factorial.cpp 创建程序集文件时,我得到以下信息:

    .file   "tail_call_opt.cpp"
.text
.globl _Z9factoriali
.type _Z9factoriali, @function
_Z9factoriali:
.LFB0:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $24, %esp
cmpl $0, 8(%ebp)
jne .L2
movl $1, %eax
jmp .L3
.L2:
movl 8(%ebp), %eax
subl $1, %eax
movl %eax, (%esp)
call _Z9factoriali
imull 8(%ebp), %eax
.L3:
leave
ret
.cfi_endproc
.LFE0:
.size _Z9factoriali, .-_Z9factoriali
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $5, (%esp)
call _Z9factoriali
movl $0, %eax
leave
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

我可以理解大部分内容,但是 .cfi 和 .LFE 部分的用途是什么?我在哪里可以了解更多关于 gcc 生成的程序集的信息?

最佳答案

这些指令告诉 gas 发出 Dwarf Call Frame Information 标签,这些标签显然用于在帧指针丢失时重建堆栈回溯。在您的情况下,帧指针存在,所以我想它可以用于在异常处理期间执行展开。这种机制的开销比旧的 sjlj (setjump/longjump) 少。见 here ,以及链接的 Dwarf 规范。

对于.Lxx标签,.L前缀表示标签是本文件本地的,不会与其他文件中的同名标签冲突。 GCC 通常将 .L 用于自动生成的标签。在这种情况下,“FB”很可能表示“函数开始”,“FE”表示“函数结束”。

关于c++ - GCC 从 c++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3564752/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com