2010-03-27 1 views
79

모든 줄 다음에 .CFI 지시문이있는 것 같습니다. 또한이 예문의 넓은 다양성이 있습니다. .cfi_startproc, .cfi_endprocmore here입니다.Gnu 어셈블러 (GAS)의 CFI 지시문은 무엇을 위해 사용됩니까?

.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 

나는 이것들의 목적을 이해하지 못했다.

+2

설명 레지스터 (6)에 있는지를 말해' GNU AS' [here] (https://sourceware.org/binutils/docs-2.24/as/CFI-directives.html#CFI-directives) – Paschalis

+0

관련 : [GCC/clang 어셈블리 출력에서 ​​"노이즈"를 제거하는 방법? ] (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output) 지시문없이 지침 만 원한다면 좋은 방법은 http://gcc.godbolt.org/에 코드를 삽입하여 여러 버전의 다양한 컴파일러 (비 x86 포함)에서 필터링 된 asm 출력을 필터링하고 소스 행을 asm 블록과 일치시키는 색상 강조 표시를 사용하는 것입니다. –

답변

53

나는 그것이 Call Frame Information의 약자이며 콜 프레임을 관리하기위한 GNU AS 확장 기능이라고 생각합니다. DeveloperWorks에서 :

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

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

이러한 기능을 사용하지 않으려면 David's answer을 참조하십시오.

+4

또한 .LFB0, .LFB1, .LFE0, .LFE1에 대한 단어를 말할 수 있습니다. – claws

+10

.Lxx는 [여기] (http://stackoverflow.com/questions/3564752)에 설명되어 있습니다. – ignis

122

이를 사용하지 않으려면 GCC 옵션

-fno-asynchronous-unwind-tables 

주를 사용, 나는 이것이 정말 오래된 스레드 알지만,이 cfi_startproc를 들어, 많은 사람들이 아마 해제하러 온 구글의 상단 결과입니다 산출.


도 필요할 수 있습니다.

+1

안녕하세요 @ 데이비드, 낡은 질문 인 것에 대해 걱정하지 마십시오. 당신이 더 나은 대답을한다면, 언제나 그것을 자유롭게 제공하십시오.물론 +1입니다. 검색자가이 출력을 사용하지 않으려는 경우 내 답변에 메모를 추가했습니다. –

+7

당신은 영웅입니다. –

+8

'-fno-dwarf2-cfi-asm'도 필요할 수 있습니다. – technosaurus

19

CFI 지시어는 디버깅에 사용됩니다. 디버거에서 스택을 푸는 데 사용할 수 있습니다. 예 : 프로 시저 A가 프로 시저 B를 호출하고 공통 프로 시저 C를 호출하면 프로 시저 C가 실패합니다. 이제 누가 실제로 C를 호출했는지 알고 싶습니다. 그러면 누가 B를 호출했는지 알고 싶을 수도 있습니다.

디버거가 스택 포인터 (% rsp)를 사용하고 % rbp를 사용하여이 스택을 풀 수 있지만, 그들을 찾으러. CFI 지시어가 올 곳이다.

movq %rsp, %rbp 
.cfi_def_cfa_register 6 

그래서 여기 마지막 줄은 "전화 프레임 주소"(%의 RBP)의`cfi` 지침의

+1

그러나 cfi의 예외 처리 사용은 디버깅보다 더 자주 발생해야한다고 생각합니다. – osgx

+4

실제로 CFA는 "표준 프레임 주소"를 나타냅니다. [here] (http://stackoverflow.com/a/7535848/21475)를 참조하십시오. – Cameron

+0

- [ImperialViolet - 어셈블리 파일의 CFI 지시문] (https://www.imperialviolet.org/2017/01/18/cfi.html) –