assembly - and - ¿Para qué se usan las directivas CFI en Gnu Assembler(GAS)?
and assembly x86 (3)
Parece que hay una directiva .CFI después de cada línea y también hay una amplia variedad de estos ej., .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.
Las directivas CFI se utilizan para la depuración. 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 quiere saber quién llamó realmente a C y luego es posible que desee saber quién llamó B.
Un depurador puede desenrollar 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 de CFI.
movq %rsp, %rbp
.cfi_def_cfa_register 6
entonces la última línea aquí dice que la "Dirección del cuadro de llamada" ahora está en el registro 6 (% rbp)
Para deshabilitar estos, use la opción gcc
-fno-asynchronous-unwind-tables
Tenga en cuenta que sé que este es un hilo muy antiguo, pero este es el resultado principal en google para cfi_startproc, por lo que muchas personas probablemente accedan aquí para inhabilitar esa salida.
-fno-dwarf2-cfi-asm
puede ser necesario.
Tengo la sensación de que significa Call Frame Information y es una extensión GNU AS para administrar los marcos de llamada. Desde DeveloperWorks :
En algunas arquitecturas, el manejo de excepciones se debe gestionar con directivas de información de marco de llamadas. Estas directivas se usan en el ensamblaje para dirigir el manejo de excepciones. Estas directivas están disponibles en Linux en POWER, si, por cualquier motivo (por ejemplo, la portabilidad de la base de código), la información de manejo de excepciones generada por GCC no es suficiente.
Parece que estos se generan en algunas plataformas según la necesidad del manejo de excepciones.
Si está buscando deshabilitar estos, vea la respuesta de David .