Gnu汇编程序(GAS)中的CFI指令是什么?
在每一行之后似乎都有一个.CFI指令,而且这些.cfi_startproc
, .cfi_endproc
, .cfi_endproc
等也有很多.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
我没有得到这些的目的。
我有一个感觉它代表呼叫帧信息 ,是一个GNU AS扩展来pipe理呼叫帧。 来自DeveloperWorks :
在一些体系结构中,exception处理必须通过调用帧信息指令进行pipe理。 这些指令在汇编中用于指导exception处理。 如果出于任何原因(例如代码库的可移植性),这些指令在Linux on POWER上可用,则GCC生成的exception处理信息是不够的。
它看起来像是在一些平台上生成的,这取决于是否需要exception处理。
如果你想禁用这些,请参阅David的回答 。
要禁用这些,请使用gcc选项
-fno-asynchronous-unwind-tables
请注意,我知道这是一个非常古老的线程,但是这是Google对于cfi_startproc的最高结果,所以很多人可能会来这里禁用该输出。
-fno-dwarf2-cfi-asm
也可能需要。
CFI指令用于debugging。 它允许debugging器展开堆栈。 例如:如果程序A调用程序B,程序B然后调用一个通用程序C.程序C失败。 你现在想知道谁实际上叫C,然后你可能想知道谁叫B.
debugging器可以通过使用堆栈指针(%rsp)并注册%rbp来展开这个堆栈,但是它需要知道如何find它们。 这就是CFI指令进来的地方。
movq %rsp, %rbp .cfi_def_cfa_register 6
所以这里的最后一行告诉它“呼叫帧地址”现在在寄存器6(%rbp)
- 导入证书后出现Java Keytool错误,“keytool error:java.io.FileNotFoundException&Access Denied”
- TCP套接字和networking套接字之间的区别,还有一次