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