developer tip

Gnu 어셈블러 (GAS)의 CFI 지시문은 무엇에 사용됩니까?

optionbox 2020. 7. 30. 10:21
반응형

Gnu 어셈블러 (GAS)의 CFI 지시문은 무엇에 사용됩니까?


모든 라인 후 .CFI 지시어 것 같다 또한이 넓은이 전의 varities., .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

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


콜 프레임 정보의 약자이며 콜 프레임 을 관리하는 GNU AS 확장입니다. 에서 DeveloperWorks의 :

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

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

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


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

-fno-asynchronous-unwind-tables

참고로, 이것은 실제로 오래된 스레드라는 것을 알고 있지만 이것이 cfi_startproc에 대한 Google의 최고 결과이므로 많은 사람들이 그 출력을 비활성화하기 위해 여기에옵니다.


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


CFI 지시문은 디버깅에 사용됩니다. 디버거가 스택을 풀 수 있습니다. 예를 들어, 프로 시저 A가 프로 시저 B를 호출하고 일반 프로 시저 C를 호출하는 경우 프로 시저 C는 실패합니다. 이제 누가 실제로 C를 불렀는지 알고 싶으면 누가 B를 불렀는지 알고 싶을 것입니다.

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

movq    %rsp, %rbp
.cfi_def_cfa_register 6

so the last line here tell it that the "Call frame address" is now in register 6 (%rbp)

참고URL : https://stackoverflow.com/questions/2529185/what-are-cfi-directives-in-gnu-assembler-gas-used-for

반응형