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
'developer tip' 카테고리의 다른 글
jQuery 슬라이드 왼쪽 및 표시 (0) | 2020.07.30 |
---|---|
LIMIT 절에 bindValue 메소드를 적용하는 방법은 무엇입니까? (0) | 2020.07.30 |
Matplotlib 투명 선 플롯 (0) | 2020.07.30 |
Maven의 로컬 저장소 위치를 CLI 매개 변수로 지정 (0) | 2020.07.30 |
form.submit의 응답을 캡처하는 방법 (0) | 2020.07.30 |