간단한 C++ 프로그램의 어셈블리 출력을 이해하려고합니다. 이것은 내 C++ 프로그램입니다.간단한 C++ 프로그램의 어셈블리 출력
void func()
{}
int main()
{
func();
}
나는 나는 다음과 같은 어셈블리 코드를 얻을 수 위의 프로그램의 어셈블리 코드를 얻을 수 --save-임시 직원 옵션을 g ++ 사용하는 경우.
.file "main.cpp"
.text
.globl _Z4funcv
.type _Z4funcv, @function
_Z4funcv:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size _Z4funcv, .-_Z4funcv
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
call _Z4funcv
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
.section .note.GNU-stack,"",@progbits
어셈블리 내 지식에 따르면 데이터, 텍스트 및 BSS있는 모든 어셈블리 프로그램의 3 개 부분이 있어야한다. 또한 텍스트 섹션은 'global _start'로 시작해야합니다. 나는이 어셈블리 코드에서 그 중 어떤 것도 볼 수 없다. 누군가 위의 어셈블리 코드를 이해하는 데 도움을 줄 수 있습니까? C++ 코드와도 관련이 있다면 훌륭 할 것입니다.
모든 종류의 도움을 주시면 감사하겠습니다.
일반적으로 어셈블리 소스 코드가 아닌 객체 (이진) 코드와 일치하는 맵 파일 내의 섹션을 찾아야한다고 생각합니다. –
'_start'는 링크 할 CRT (C 런타임)에있을 가능성이 큽니다. 차례대로'main' 함수를 호출 할 것입니다. 또한 사용하지 않는 섹션을 정의 할 필요가 없습니다. – Michael
두 번째 줄에는 어셈블러 지시문'.text'가 있습니다. 이것은 텍스트 섹션입니다. 전역 변수가 없으므로 다른 섹션은 필요하지 않습니다. – rkhb