¿Para qué se utilizan las directivas CFI en el ensamblador de GNU (gas)?

StackOverflow https://stackoverflow.com/questions/2529185

  •  22-09-2019
  •  | 
  •  

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.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top