Question

Il semble y avoir une directive .CFI après chaque ligne et il y a aussi de ces larges varities ex., .cfi_startproc, etc .. .cfi_endproc plus .

    .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 le but de ces derniers.

Était-ce utile?

La solution

J'ai le sentiment qu'il signifie Appel d'information de trame et est un GNU comme une extension pour gérer des contextes d'appel. De DeveloperWorks :

  

Sur certaines architectures, exception   la manipulation doit être gérée avec appel   Cadre des directives d'information. Celles-ci   directives sont utilisées dans l'ensemble de   la gestion des exceptions directe. Celles-ci   directives sont disponibles sur Linux   PUISSANCE, si, pour une raison quelconque (portabilité   de la base de code, par exemple), la   GCC généré la gestion des exceptions   l'information ne suffit pas.

On dirait que ceux-ci sont générées sur certaines plates-formes en fonction des besoins pour la gestion des exceptions.

Si vous cherchez à les désactiver, s'il vous plaît voir réponse de David .

Autres conseils

Pour désactiver ces derniers, utilisez l'option gcc

-fno-asynchronous-unwind-tables

Remarque, je sais que c'est un fil vraiment vieux, mais c'est le meilleur résultat sur Google pour cfi_startproc, tant de gens viennent probablement ici pour désactiver cette sortie.


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

Les directives de la FCI sont utilisées pour le débogage. Il permet au débogueur de dénouer une pile. Par exemple, si la procédure A appelle la procédure B, qui appelle ensuite une procédure commune C. Procédure C échoue. Vous voulez maintenant savoir qui en fait appelé C et alors vous voudrez peut-être savoir qui a appelé B.

Un débogueur peut décompresser cette pile en utilisant le pointeur de pile (% rsp) et enregistrer% RBP, mais il a besoin de savoir comment les trouver. C'est là que les directives de la FCI entrent en jeu.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

la dernière ligne ici lui dire que le « Call adresse de trame » est maintenant dans le registre 6 (% RBP)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top