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.
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 .
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.
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)