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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top