Para quais são as diretivas CFI no assembler GNU (GAS) usadas?
Pergunta
Parece haver uma diretiva .cfi após cada linha e também existem grandes variadas dessas 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 consegui o objetivo disso.
Solução
Eu tenho a sensação de que significa Informações sobre quadros de chamada e é um GNU como extensão para gerenciar quadros de chamada. A partir de Desenvolvedorworks:
Em algumas arquiteturas, o manuseio de exceções deve ser gerenciado com as diretivas de informações sobre quadros de chamada. Essas diretivas são usadas na montagem para direcionar o manuseio de exceções. Essas diretivas estão disponíveis no Linux on Power, se, por qualquer motivo (portabilidade da base de código, por exemplo), o GCC gerou informações de manuseio de exceções não for suficiente.
Parece que estes são gerados em algumas plataformas, dependendo da necessidade de manipulação de exceções.
Se você deseja desativá -los, veja Resposta de David.
Outras dicas
Para desativá -los, use a opção GCC
-fno-asynchronous-unwind-tables
Observe que eu sei que este é um tópico muito antigo, mas este é o resultado principal no Google para CFI_STARTPROC, muitas pessoas provavelmente vêm aqui para desativar essa saída.
-fno-dwarf2-cfi-asm
Pode ser necessário também.
As diretivas CFI são usadas para depuração. Ele permite que o depurador relaxe uma pilha. Por exemplo: se o procedimento A Chamadas Procedimento B, que chama um procedimento comum C. O procedimento c falhar. Agora você quer saber quem realmente ligou para C e então você pode querer saber quem ligou para B.
Um depurador pode desenrolar essa pilha usando o ponteiro da pilha ( %rsp) e registrar %RBP, no entanto, precisa saber como encontrá -los. É aí que entram as diretrizes da CFI.
movq %rsp, %rbp
.cfi_def_cfa_register 6
Portanto, a última linha aqui diz que o "endereço do quadro de chamada" está agora no Registro 6 (%RBP)