¿Para qué se utilizan las directivas CFI en el ensamblador de GNU (gas)?
Pregunta
Parece que hay una directiva .cfi después de cada línea y también hay amplias varidades de estos ex.,.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 tuve el propósito de estos.
Solución
Tengo la sensación de que representa Información del marco de llamadas y es un GNU como extensión para administrar marcos de llamadas. De Desarrollador:
En algunas arquitecturas, el manejo de excepciones debe administrarse con las directivas de información del marco de llamadas. Estas directivas se utilizan en el ensamblaje para el manejo directo de excepciones. Estas directivas están disponibles en Linux en Power, si, por algún motivo (portabilidad de la base de código, por ejemplo), el GCC generó la información de manejo de excepciones no es suficiente.
Parece que estas se generan en algunas plataformas dependiendo de la necesidad de manejo de excepciones.
Si está buscando deshabilitarlos, consulte Respuesta de David.
Otros consejos
Para deshabilitarlos, use la opción GCC
-fno-asynchronous-unwind-tables
Nota, sé que este es un hilo realmente antiguo, pero este es el resultado principal en Google para CFI_StartProc, por lo que muchas personas probablemente vienen aquí para deshabilitar esa salida.
-fno-dwarf2-cfi-asm
puede ser necesario también.
Las directivas CFI se utilizan para la depuración. Permite que el depurador relaje 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 saber quién llamó a B.
Un depurador puede descansar esta pila utilizando el puntero de la pila ( %RSP) y registrar %RBP, sin embargo, necesita saber cómo encontrarlos. Ahí es donde entran las directivas CFI.
movq %rsp, %rbp
.cfi_def_cfa_register 6
Entonces, la última línea aquí dice que la "dirección del marco de llamadas" ahora está en el registro 6 (%RBP)