Parece haber una directiva .CFI después de cada línea y también hay una gran variedad de estas, por ejemplo .cfi_startproc
, .cfi_endproc
etc., más aquí .
.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
No entendí el propósito de estos.
cfi
instrucciones deGNU AS
aquíRespuestas:
Tengo la sensación de que significa información de tramas de llamadas y es una extensión GNU AS para administrar tramas de llamadas. Desde DeveloperWorks :
Parece que estos se generan en algunas plataformas según la necesidad de manejo de excepciones.
Si desea desactivarlos, consulte la respuesta de David .
fuente
:
). Ver stackoverflow.com/a/15285058/4294399Para deshabilitarlos, use la opción gcc
-fno-dwarf2-cfi-asm
también puede ser necesario.fuente
-fno-dwarf2-cfi-asm
también puede ser necesarioLas directivas CFI se utilizan para depurar. Permite al depurador desenrollar una pila. Por ejemplo: si el procedimiento A llama al procedimiento B, que luego llama a un procedimiento común C. El procedimiento C falla. Ahora desea saber quién llamó realmente a C y luego puede querer saber quién llamó a B.
Un depurador puede desenrollar esta pila usando el puntero de pila (% rsp) y registrar% rbp, sin embargo, necesita saber cómo encontrarlos. Ahí es donde entran las directivas CFI.
por lo que la última línea aquí le dice que la "Dirección del marco de llamada" ahora está en el registro 6 (% rbp)
fuente
-fomit-frame-pointer
, como alternativa a RBP (que está activado de forma predeterminada con gcc o clang-O1
y superior). Es utilizado por el manejo de excepciones de C ++, así como por los depuradores / perfiladores. En el código con punteros de trama RBP tradicionales, el valor RBP actual siempre apunta a un valor RBP guardado, y eso apunta al anterior formando una lista vinculada. En ese caso, no es necesario CFI. (Aunque en las funciones que usan un puntero de marco, CFI cfa_register evita la necesidad de más metadatos para cada cambio de RSP, como está mostrando).Para deshabilitarlos, g ++ necesita
-fno-exceptions
junto con lo mencionado anteriormente-fno-asynchronous-unwind-tables
, siempre que no use excepciones.fuente