131 votes

A quoi servent les directives CFI dans l'assembleur Gnu (GAS) ?

Il semble y avoir une directive .CFI après chaque ligne et il existe une grande variété 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 tout ça.

3 votes

Description de cfi instructions de GNU AS aquí

1 votes

Liés : Comment supprimer le "bruit" de la sortie de l'assemblage GCC/clang ? si vous voulez juste les instructions sans les directives. Un bon moyen est de mettre votre code sur gcc.godbolt.org pour voir une belle sortie asm filtrée de diverses versions de divers compilateurs (y compris non-x86), avec une mise en évidence par couleur pour faire correspondre les lignes de source avec les blocs asm.

151voto

David Watson Points 614

Pour les désactiver, utilisez l'option gcc

-fno-asynchronous-unwind-tables

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

14 votes

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

1 votes

Si vous le désactivez pour une sortie asm lisible par l'homme, voir Comment supprimer le "bruit" de la sortie de l'assemblage GCC/clang ? pour d'autres options et astuces utiles.

1 votes

Il est intéressant de noter que la réponse comment les désactiver a obtenu plus de votes positifs que celles qui décrivent ce qu'ils sont :)

75voto

Ninefingers Points 18767

J'ai l'impression que ça veut dire Informations sur la trame d'appel et est une extension de GNU AS pour gérer les trames d'appels. À partir de DeveloperWorks :

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

Il semble que ceux-ci soient générés sur certaines plateformes en fonction de la nécessité de gérer les exceptions.

Si vous cherchez à les désactiver, veuillez consulter la rubrique La réponse de David .

5 votes

Pouvez-vous aussi dire un mot sur les .LFB0, .LFB1, .LFE0, .LFE1 ?

0 votes

@claws - Il s'agit d'étiquettes générées par le compilateur (comme vous pouvez le voir à partir de l'étiquette de l'utilisateur). : ). Voir stackoverflow.com/a/15285058/4294399

33voto

Graham Stott Points 21

Les directives CFI sont utilisées pour le débogage. Elles permettent au débogueur de dérouler une pile. Par exemple : si la procédure A appelle la procédure B qui appelle ensuite une procédure commune C. La procédure C échoue. Vous voulez maintenant savoir qui a réellement appelé C et ensuite vous voudrez peut-être savoir qui a appelé B.

Un débogueur peut dérouler cette pile en utilisant le pointeur de pile (%rsp) et le registre %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 la trame d'appel est maintenant dans le registre 6 (%rbp)

2 votes

Mais l'utilisation de cfi pour gérer les exceptions devrait être plus fréquente que le débogage, je pense.

6 votes

En fait, CFA signifie "adresse de trame canonique". Voir aquí .

0 votes

4voto

iw4h Points 41

Pour les désactiver, g++ a besoin de -fno-exceptions en plus de ceux mentionnés précédemment -fno-asynchronous-unwind-tables à condition de ne pas utiliser d'exceptions.

-1voto

kingkong Points 1

Eh bien, c'est juste pour intégrité du flux de contrôle . Ils sont essentiellement des éléments d'information transmis aux débogueurs et autres outils pour décrire le déroulement prévu du programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X