128

.cfi_startprocすべての行の後に.CFI ディレクティブがあるようで、これらにはさまざまな種類があり.cfi_endprocます 。

    .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

これらの目的がわかりませんでした。

4

5 に答える 5

72

Call Frame Informationの略で、呼び出しフレームを管理するための GNU AS 拡張機能であると感じています。DeveloperWorksから:

一部のアーキテクチャでは、Call Frame Information ディレクティブを使用して例外処理を管理する必要があります。これらのディレクティブは、例外処理を指示するためにアセンブリで使用されます。これらのディレクティブは、Linux on POWER で使用できます。何らかの理由 (コード ベースの移植性など) で、GCC が生成した例外処理情報が十分でない場合に使用できます。

これらは、例外処理の必要性に応じて、一部のプラットフォームで生成されるようです。

これらを無効にする場合は、David's answerを参照してください。

于 2010-03-27T12:24:45.383 に答える
31

CFI ディレクティブはデバッグに使用されます。これにより、デバッガーはスタックを巻き戻すことができます。たとえば、プロシージャ A がプロシージャ B を呼び出し、次にプロシージャ B が共通プロシージャ C を呼び出す場合、プロシージャ C は失敗します。ここで、C に実際に電話をかけたのが誰であるかを知りたい場合は、B に電話をかけたのが誰であるかを知りたい場合があります。

デバッガーは、スタック ポインター (%rsp) を使用してこのスタックを巻き戻し、%rbp を登録できますが、それらを見つける方法を知る必要があります。そこで登場するのが CFI 指令です。

movq    %rsp, %rbp
.cfi_def_cfa_register 6

ここの最後の行は、「呼び出しフレームアドレス」が現在レジスタ 6 (%rbp) にあることを示しています。

于 2014-05-08T00:20:31.363 に答える