[assembly] Gnu Assembler (GAS)의 CFI 지시문은 무엇에 사용됩니까?

모든 줄마다 .CFI 지시문이있는 것 같고 여기에는 이러한 ex. .cfi_startproc, .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

나는 이것들의 목적을 얻지 못했습니다.



답변

Call Frame Information의 약자이며 통화 프레임 을 관리하기위한 GNU AS 확장입니다. 에서 DeveloperWorks의 :

일부 아키텍처에서는 호출 프레임 정보 지시문을 사용하여 예외 처리를 관리해야합니다. 이러한 지시문은 어셈블리에서 예외 처리를 지시하는 데 사용됩니다. 이러한 지시문은 어떤 이유로 든 (예 : 코드베이스의 이식성) GCC 생성 예외 처리 정보가 충분하지 않은 경우 Linux on POWER에서 사용할 수 있습니다.

예외 처리의 필요성에 따라 일부 플랫폼에서 생성 된 것처럼 보입니다.

이러한 기능을 비활성화하려면 David의 답변을 참조하십시오 .


답변

이를 비활성화하려면 gcc 옵션을 사용하십시오.

-fno-asynchronous-unwind-tables

-fno-dwarf2-cfi-asm 또한 필요할 수 있습니다.


답변

CFI 지시문은 디버깅에 사용됩니다. 디버거가 스택을 해제 할 수 있습니다. 예 : 프로 시저 A가 프로 시저 B를 호출 한 다음 공통 프로 시저 C를 호출하는 경우 프로 시저 C가 실패합니다. 이제 누가 실제로 C에 전화했는지 알고 싶고 누가 B에 전화했는지 알고 싶을 수 있습니다.

디버거는 스택 포인터 (% rsp)를 사용하고 % rbp를 등록하여이 스택을 해제 할 수 있지만 찾는 방법을 알아야합니다. 이것이 CFI 지시문이 들어오는 곳입니다.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

여기 마지막 줄은 “Call frame address”가 이제 레지스터 6 (% rbp)에 있음을 알려줍니다.


답변

이를 비활성화하려면 예외를 사용하지 않는 -fno-exceptions한 g ++ 에 앞서 언급 한와 함께 필요합니다 -fno-asynchronous-unwind-tables.


답변