2010-03-27 11 views
79

Sembra che ci sia una direttiva .CFI dopo ogni riga e ci sono anche molte varianti di questi ex., .cfi_startproc, .cfi_endproc ecc. more here.Quali sono le direttive CFI in GNU Assembler (GAS) utilizzati per?

.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 ottenuto lo scopo di questi.

+2

descrizione del 'istruzioni cfi' di' GNU AS' [qui] (https://sourceware.org/binutils/docs-2.24/as/CFI-directives.html#CFI-directives) – Paschalis

+0

related: [Come rimuovere "noise" dall'output di GCC/clang assembly? ] (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output), se si desidera solo le istruzioni senza direttive. Un buon modo è di inserire il codice su http://gcc.godbolt.org/ per vedere un bel output filtrato asm da varie versioni di vari compilatori (incluso non-x86), con l'evidenziazione del colore per far corrispondere le linee di origine con i blocchi asm. –

risposta

53

ho la sensazione che sta per Call Frame Information ed è un'estensione GNU AS per gestire i record di attivazione. Da DeveloperWorks:

Su alcune architetture, la gestione delle eccezioni deve essere gestita con Call direttive Informazioni Frame. Questi direttive sono utilizzati nell'assieme per manipolazione diretta eccezioni. Queste direttive sono disponibili su Linux su POWER, se, per qualsiasi motivo (ad esempio la portabilità della base di codice), l'informazione gestita dall'eccezione GCC non è sufficiente.

Sembra che questi siano generati su alcune piattaforme a seconda della necessità di gestione delle eccezioni.

Se stai cercando di disabilitare questi, vedere David's answer.

+4

Puoi anche dire una parola su .LFB0, .LFB1, .LFE0, .LFE1 – claws

+10

.Lxx sono descritti [qui] (http://stackoverflow.com/questions/3564752). – ignis

122

Per disabilitare questi, utilizzare l'opzione di gcc

-fno-asynchronous-unwind-tables 

nota, so che questo è un filo molto vecchio, ma questo è il risultato top su Google per cfi_startproc, così tante persone probabilmente vengono qui per disabilitare tale produzione.


-fno-dwarf2-cfi-asm può essere necessaria anche.

direttive
+1

Salve @David, non preoccuparti che si tratti di una vecchia domanda. Se hai una risposta migliore, sentiti sempre libero di fornirla su SO.+1 ovviamente, e ho aggiunto una nota alla mia risposta che rimanda ai tuoi se gli utenti cercano di disabilitare questo output. –

+7

Tu, signore, sei un eroe. –

+8

'-fno-dwarf2-cfi-asm' potrebbe essere necessario anche – technosaurus

19

Il CFI sono utilizzati per il debugging. Permette al debugger di srotolare uno stack. Ad esempio: se la procedura A chiama la procedura B che quindi chiama una procedura comune C. La procedura C fallisce. Ora vuoi sapere chi ha effettivamente chiamato C e quindi potresti voler sapere chi ha chiamato B.

Un debugger può srotolare questo stack utilizzando il puntatore dello stack (% rsp) e registrare% rbp, tuttavia è necessario sapere come trovarli. È qui che le direttive CFI sono disponibili in.

movq %rsp, %rbp 
.cfi_def_cfa_register 6 

così l'ultima riga qui dirgli che "Indirizzo struttura chiamata" è ora nel registro 6 (% RBP)

+1

Ma l'utilizzo della gestione delle eccezioni di cfi dovrebbe essere più frequente del debug, credo. – osgx

+4

In realtà CFA sta per "canonical frame address". Vedi [qui] (http://stackoverflow.com/a/7535848/21475). – Cameron

+0

- [ImperialViolet - Direttive CFI in file assembly] (https://www.imperialviolet.org/2017/01/18/cfi.html) –

Problemi correlati