Was ist .cfi und .LFE in Assembler-code produziert von GCC aus dem c++ - Programm?
Habe ich die folgende c++ - code
int factorial(int n){
if(n==0){
return 1;
}
return n*factorial(n-1);
}
int main(void){
factorial(5);
return 0;
}
Wenn ich erstellen Sie eine assembly-Datei mit g++ -S factorial.cpp ich bekomme die folgende:
.file "tail_call_opt.cpp"
.text
.globl _Z9factoriali
.type _Z9factoriali, @function
_Z9factoriali:
.LFB0:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $24, %esp
cmpl $0, 8(%ebp)
jne .L2
movl $1, %eax
jmp .L3
.L2:
movl 8(%ebp), %eax
subl $1, %eax
movl %eax, (%esp)
call _Z9factoriali
imull 8(%ebp), %eax
.L3:
leave
ret
.cfi_endproc
.LFE0:
.size _Z9factoriali, .-_Z9factoriali
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $5, (%esp)
call _Z9factoriali
movl $0, %eax
leave
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Kann ich Folgen die meisten, aber was ist der Zweck der .cfi und der .LFE-Teile?
Wo kann ich mehr über die Montage produziert von gcc?
- möglich, Duplikat der Was sind CFI-Richtlinien in Gnu Assembler (GAS) verwendet?
- Es ist kein dupe. Die andere Frage, die nicht gerade LFE.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Richtlinien sagen, gas zu emittieren Zwerg Call-Frame-Daten-tags, die anscheinend verwendet, um zu rekonstruieren, einen stack backtrace, wenn ein frame-pointer fehlt. In Ihrem Fall ist die frame-pointer vorhanden ist, so dass ich denke, es könnte verwendet werden, um Entspannung während der Ausnahmebehandlung. Ein solcher Mechanismus hat weniger overhead als das alte sjlj (setjump/longjump) ein. Sehen hier, und auch die verlinkten Zwerg spec.
Als für .Lxx labels .L-Präfix zeigt an, dass das label nur lokal in dieser Datei und wird daher nicht in Konflikt mit der same-name-labels in anderen Dateien. GCC verwendet in der Regel .L für auto-generierten labels. In diesem Fall wohl "FB" bedeutet "Funktion " begin" und "FE" bedeutet "Funktion beenden".