Parece haver uma directiva .CFI após cada linha e também há grande variedades destes ex., .cfi_startproc
, .cfi_endproc
Etc .. mais aqui .
.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
Eu não entendi o propósito disso.
cfi
instruçõesGNU AS
aquiRespostas:
Tenho a sensação de que significa Call Frame Information e é uma extensão GNU AS para gerenciar call frames. De DeveloperWorks :
Parece que eles são gerados em algumas plataformas, dependendo da necessidade de tratamento de exceções.
Se você deseja desativá-los, consulte a resposta de David .
fonte
:
). Consulte stackoverflow.com/a/15285058/4294399Para desabilitá-los, use a opção gcc
-fno-dwarf2-cfi-asm
pode ser necessário também.fonte
-fno-dwarf2-cfi-asm
pode ser necessário tambémAs diretivas CFI são usadas para depuração. Ele permite que o depurador desenrole uma pilha. Por exemplo: se o procedimento A chama o procedimento B, que então chama um procedimento comum C. O procedimento C falha. Agora você deseja saber quem realmente ligou para C e, em seguida, pode querer saber quem ligou para B.
Um depurador pode desenrolar essa pilha usando o ponteiro da pilha (% rsp) e registrar% rbp, entretanto, ele precisa saber como encontrá-los. É aí que entram as diretivas CFI.
então a última linha aqui informa que o "endereço do quadro de chamada" está agora no registro 6 (% rbp)
fonte
-fomit-frame-pointer
, como uma alternativa para RBP (que é ativado por padrão com gcc ou clang-O1
e superior). É usado pelo tratamento de exceções C ++, bem como depuradores / criadores de perfil. No código com ponteiros de quadro RBP tradicionais, o valor RBP atual sempre aponta para um valor RBP salvo, e isso aponta para o anterior formando uma lista vinculada. Não há necessidade de CFI nesse caso. (Embora em funções que usam um ponteiro de frame, o CFI cfa_register evita a necessidade de mais metadados para cada alteração do RSP, como você está mostrando.)Para desabilitá-los, o g ++ precisa
-fno-exceptions
junto com o mencionado anteriormente-fno-asynchronous-unwind-tables
, desde que você não use exceções.fonte