Tampaknya ada arahan .CFI setelah setiap baris dan juga ada variasi luas dari contoh. .cfi_startproc
,, .cfi_endproc
Dll .. lebih lanjut di sini .
.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
Saya tidak mengerti tujuan ini.
cfi
instruksi diGNU AS
siniJawaban:
Saya merasa itu singkatan dari Informasi Bingkai Panggilan dan merupakan ekstensi GNU AS untuk mengelola bingkai panggilan. Dari DeveloperWorks :
Sepertinya ini dibuat pada beberapa platform bergantung pada kebutuhan penanganan pengecualian.
Jika Anda ingin menonaktifkan ini, silakan lihat jawaban David .
sumber
:
). Lihat stackoverflow.com/a/15285058/4294399Untuk menonaktifkannya, gunakan opsi gcc
-fno-dwarf2-cfi-asm
mungkin dibutuhkan juga.sumber
-fno-dwarf2-cfi-asm
mungkin diperlukan jugaArahan CFI digunakan untuk debugging. Ini memungkinkan debugger untuk melepas tumpukan. Misalnya: jika prosedur A memanggil prosedur B yang kemudian memanggil prosedur umum C. Prosedur C gagal. Sekarang Anda ingin tahu siapa sebenarnya yang menelepon C dan kemudian Anda mungkin ingin tahu siapa yang menelepon B.
Debugger dapat melepas tumpukan ini dengan menggunakan penunjuk tumpukan (% rsp) dan mendaftarkan% rbp, namun ia perlu mengetahui cara menemukannya. Di situlah arahan CFI masuk.
jadi baris terakhir di sini mengatakan bahwa "Alamat bingkai panggilan" sekarang ada di register 6 (% rbp)
sumber
-fomit-frame-pointer
, sebagai alternatif untuk RBP (yang aktif secara default dengan gcc atau clang-O1
dan yang lebih tinggi). Ini digunakan oleh penanganan pengecualian C ++ serta debugger / profiler. Dalam kode dengan penunjuk bingkai RBP tradisional, nilai RBP saat ini selalu menunjuk pada nilai RBP yang disimpan, dan yang menunjuk ke yang sebelumnya membentuk daftar tertaut. Tidak perlu CFI dalam kasus itu. (Meskipun dalam fungsi yang menggunakan penunjuk bingkai, CFI cfa_register menghindari kebutuhan lebih banyak metadata untuk setiap perubahan RSP, seperti yang Anda tunjukkan.)Untuk menonaktifkannya, g ++ perlu
-fno-exceptions
bersama dengan yang disebutkan sebelumnya-fno-asynchronous-unwind-tables
, asalkan Anda tidak menggunakan pengecualian.sumber