web-dev-qa-db-fra.com

À quoi servent les directives CFI dans Gnu Assembler (GAS)?

Il semble y avoir une directive .CFI après chaque ligne et il existe également de grandes variantes de ces ex., .cfi_startproc, .cfi_endproc etc .. plus ici .

    .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

Je n'ai pas compris le but de ceux-ci.

109
claws

J'ai le sentiment que cela signifie Call Frame Information et est une extension GNU AS pour gérer les trames d'appel. De DeveloperWorks :

Sur certaines architectures, la gestion des exceptions doit être gérée avec les directives Call Frame Information. Ces directives sont utilisées dans l'assembly pour diriger la gestion des exceptions. Ces directives sont disponibles sur Linux sur POWER si, pour une raison quelconque (portabilité de la base de code, par exemple), les informations de gestion des exceptions générées par GCC ne sont pas suffisantes.

Il semble que ceux-ci soient générés sur certaines plates-formes en fonction du besoin de gestion des exceptions.

Si vous cherchez à les désactiver, veuillez voir réponse de David .

65
user257111

Pour les désactiver, utilisez l'option gcc

-fno-asynchronous-unwind-tables

Remarque, je sais que c'est un fil très ancien, mais c'est le meilleur résultat sur google pour cfi_startproc, donc beaucoup de gens viennent probablement ici pour désactiver cette sortie.


-fno-dwarf2-cfi-asm peut également être nécessaire.

137
David Watson

Les directives CFI sont utilisées pour le débogage. Il permet au débogueur de dérouler une pile. Par exemple: si la procédure A appelle la procédure B qui appelle alors une procédure commune C. La procédure C échoue. Vous voulez maintenant savoir qui a réellement appelé C, puis vous pouvez savoir qui a appelé B.

Un débogueur peut dérouler cette pile en utilisant le pointeur de pile (% rsp) et enregistrer% rbp, mais il doit savoir comment les trouver. C'est là qu'interviennent les directives CFI.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

donc la dernière ligne ici lui dit que "l'adresse de trame d'appel" est maintenant dans le registre 6 (% rbp)

28
Graham Stott