A cosa servono le direttive CFI in Gnu Assembler (GAS)?


118

Sembra che ci siano una direttiva .CFI dopo ogni linea e ci sono anche un'ampia Varietà di questi ex., .cfi_startproc, .cfi_endprocEcc .. di più qui .

    .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

Non ho capito lo scopo di questi.


3
descrizione delle cfiistruzioni di GNU AS qui
Paschalis

correlati: Come rimuovere il "rumore" dall'output dell'assembly GCC / clang? , se vuoi solo le istruzioni senza le direttive. Un bel modo è mettere il codice su gcc.godbolt.org per vedere un bell'output asm filtrato da varie versioni di vari compilatori (incluso non x86), con l'evidenziazione del colore per abbinare le linee di origine con i blocchi asm.
Peter Cordes

Risposte:


70

Ho la sensazione che stia per Call Frame Information ed è un'estensione GNU AS per gestire i frame di chiamata. Da DeveloperWorks :

Su alcune architetture, la gestione delle eccezioni deve essere gestita con le direttive Call Frame Information. Queste direttive vengono utilizzate nell'assembly per indirizzare la gestione delle eccezioni. Queste direttive sono disponibili su Linux su POWER se, per qualsiasi motivo (portabilità del codice base, per esempio), le informazioni di gestione delle eccezioni generate da GCC non sono sufficienti.

Sembra che questi vengano generati su alcune piattaforme a seconda della necessità di gestire le eccezioni.

Se stai cercando di disabilitarli, leggi la risposta di David .


5
Puoi anche dire una parola su .LFB0, .LFB1, .LFE0, .LFE1
artigli

@claws - Quelle sono etichette generate dal compilatore (come puoi vedere dal :). Vedi stackoverflow.com/a/15285058/4294399
Calculuswhiz


30

Le direttive CFI vengono utilizzate per il debug. Consente al debugger di svolgere uno stack. Ad esempio: se la procedura A chiama la procedura B che poi chiama una procedura comune C. La procedura C fallisce. Ora vuoi sapere chi ha effettivamente chiamato C e poi potresti voler sapere chi ha chiamato B.

Un debugger può srotolare questo stack utilizzando il puntatore allo stack (% rsp) e registrare% rbp, tuttavia deve sapere come trovarli. È qui che entrano in gioco le direttive CFI.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

quindi l'ultima riga qui dice che "Call frame address" è ora nel registro 6 (% rbp)


2
Ma penso che l'uso della gestione delle eccezioni di cfi dovrebbe essere più frequente del debug.
osgx

6
In realtà CFA sta per "canonical frame address". Vedi qui .
Cameron


1
Le direttive CFI consentono lo svolgimento dello stack anche per il codice compilato con -fomit-frame-pointer, in alternativa a RBP (che è attivo di default con gcc o clang -O1e versioni successive). Viene utilizzato dalla gestione delle eccezioni C ++ e dai debugger / profiler. Nel codice con i tradizionali puntatori a frame RBP, il valore RBP corrente punta sempre a un valore RBP salvato e che punta a quello precedente formando un elenco collegato. Non c'è bisogno di CFI in quel caso. (Sebbene nelle funzioni che utilizzano un frame pointer, CFI cfa_register evita di aver bisogno di più metadati per ogni modifica RSP, come stai mostrando.)
Peter Cordes

2

Per disabilitarli, g ++ necessita -fno-exceptionsinsieme a quanto menzionato in precedenza -fno-asynchronous-unwind-tables, a condizione che non si utilizzino eccezioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.