Es scheint nach jeder Zeile eine .CFI-Direktive zu geben, und es gibt auch eine große Vielfalt dieser Beispiele .cfi_startproc
, .cfi_endproc
usw., mehr hier .
.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
Ich habe den Zweck dieser nicht verstanden.
cfi
Anweisungen vonGNU AS
hierAntworten:
Ich habe das Gefühl, es steht für Call Frame Information und ist eine GNU AS-Erweiterung zum Verwalten von Anrufrahmen. Von DeveloperWorks :
Es sieht so aus, als würden diese auf einigen Plattformen generiert, je nachdem, ob eine Ausnahmebehandlung erforderlich ist.
Wenn Sie diese deaktivieren möchten, lesen Sie bitte Davids Antwort .
quelle
:
). Siehe stackoverflow.com/a/15285058/4294399Um diese zu deaktivieren, verwenden Sie die Option gcc
-fno-dwarf2-cfi-asm
kann auch benötigt werden.quelle
-fno-dwarf2-cfi-asm
kann auch benötigt werdenDie CFI-Anweisungen werden zum Debuggen verwendet. Es ermöglicht dem Debugger, einen Stapel abzuwickeln. Beispiel: Wenn Prozedur A Prozedur B aufruft, die dann eine allgemeine Prozedur C aufruft. Prozedur C schlägt fehl. Sie möchten jetzt wissen, wer tatsächlich C angerufen hat, und dann möchten Sie möglicherweise wissen, wer B angerufen hat.
Ein Debugger kann diesen Stapel mithilfe des Stapelzeigers (% rsp) abwickeln und% rbp registrieren. Er muss jedoch wissen, wie er sie findet. Hier kommen die CFI-Richtlinien ins Spiel.
Die letzte Zeile hier sagt also, dass sich die "Call Frame Address" jetzt in Register 6 befindet (% rbp).
quelle
-fomit-frame-pointer
, als Alternative zu RBP (das standardmäßig mit gcc oder clang-O1
und höher aktiviert ist ). Es wird sowohl von der C ++ - Ausnahmebehandlung als auch von Debuggern / Profilern verwendet. In Code mit herkömmlichen RBP-Frame-Zeigern zeigt der aktuelle RBP-Wert immer auf einen gespeicherten RBP-Wert, und dieser zeigt auf den vorherigen und bildet eine verknüpfte Liste. In diesem Fall ist kein CFI erforderlich. (Obwohl in Funktionen, die einen Frame-Zeiger verwenden, CFI cfa_register vermeidet, dass für jede RSP-Änderung mehr Metadaten benötigt werden, wie Sie anzeigen.)Um diese zu deaktivieren, benötigt g ++
-fno-exceptions
zusammen mit den zuvor genannten-fno-asynchronous-unwind-tables
, sofern Sie keine Ausnahmen verwenden.quelle