assembler and assembly gas

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 .