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


118

모든 줄마다 .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

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


3
설명 cfi의 지시 GNU AS 여기
Paschalis

관련 : GCC / clang 어셈블리 출력에서 ​​"노이즈"를 제거하는 방법은 무엇입니까? , 지시문없이 지시 사항을 원하는 경우. 좋은 방법은 gcc.godbolt.org 에 코드를 넣어 다양한 버전의 다양한 컴파일러 (비 x86 포함)에서 필터링 된 asm 출력을 확인하고 소스 라인을 asm 블록과 일치시키는 색상 강조 표시를 사용하는 것입니다.
Peter Cordes

답변:


70

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

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

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

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


5
또한 .LFB0, .LFB1, .LFE0, .LFE1에 대해 한마디 할 수 있습니까?
claws

@claws-컴파일러에서 생성 한 레이블입니다 (에서 볼 수 있듯이 :). stackoverflow.com/a/15285058/4294399
Calculuswhiz


30

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

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

movq    %rsp, %rbp
.cfi_def_cfa_register 6

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


2
그러나 cfi의 예외 처리 사용은 디버깅보다 더 빈번해야한다고 생각합니다.
osgx 2014 년

6
실제로 CFA는 "표준 프레임 주소"를 의미합니다. 여기를 참조 하십시오 .
Cameron


1
CFI 지시문은 -fomit-frame-pointerRBP (기본적으로 gcc 또는 clang -O1이상에서 설정 됨) 의 대안으로로 컴파일 된 코드에 대해서도 스택 해제를 허용 합니다. C ++ 예외 처리 및 디버거 / 프로파일 러에서 사용됩니다. 코드에서 전통 RBP 프레임 포인터, 항상 저장 RBP 값에 점, 그리고 그 점 이전에 현재의 RBP 값은 링크 된 목록을 형성한다. 이 경우 CFI가 필요하지 않습니다. (프레임 포인터를 사용하는 함수에서는 CFI cfa_register가 표시하는 것처럼 모든 RSP 변경에 대해 더 많은 메타 데이터가 필요하지 않게합니다.)
Peter Cordes

2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.