Il semble y avoir une directive .CFI après chaque ligne et il y a aussi large de ces variétés 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.
cfi
instructions d'GNU AS
iciRéponses:
J'ai le sentiment que cela signifie Call Frame Information et qu'il s'agit d'une extension GNU AS pour gérer les trames d'appel. De DeveloperWorks :
Il semble que ceux-ci soient générés sur certaines plates-formes en fonction du besoin de gestion des exceptions.
Si vous souhaitez les désactiver, veuillez consulter la réponse de David .
la source
:
). Voir stackoverflow.com/a/15285058/4294399Pour les désactiver, utilisez l'option gcc
-fno-dwarf2-cfi-asm
peut être nécessaire également.la source
-fno-dwarf2-cfi-asm
peut être nécessaire aussiLes 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 voudrez peut-être 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 de la FCI.
donc la dernière ligne ici lui indique que "l'adresse de trame d'appel" est maintenant dans le registre 6 (% rbp)
la source
-fomit-frame-pointer
, comme alternative à RBP (qui est activé par défaut avec gcc ou clang-O1
et plus). Il est utilisé par la gestion des exceptions C ++ ainsi que par les débogueurs / profileurs. Dans le code avec des pointeurs de trame RBP traditionnels, la valeur RBP actuelle pointe toujours vers une valeur RBP enregistrée, et qui pointe vers la précédente formant une liste liée. Il n'y a pas besoin de CFI dans ce cas. (Bien que dans les fonctions qui utilisent un pointeur de cadre, CFI cfa_register évite d'avoir besoin de plus de métadonnées pour chaque changement de RSP, comme vous le montrez.)Pour les désactiver, g ++ a besoin
-fno-exceptions
de ce qui a été mentionné précédemment-fno-asynchronous-unwind-tables
, à condition que vous n'utilisiez pas d'exceptions.la source