Quelles sont les directives de la FCI dans Gnu Assembleur (GAS) utilisé?
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.
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)