'cdecl'에 해당되는 글 2건



  • Function Calling Convention

1. __cdecl

  • 인자 파싱 : Right -> Left
  • 스택 관리 : Caller, 가변 인자 허용
  • Name Mangling : 함수 이름 앞에 _추가
    ex)
    _Foo
  • C와 C++ 함수의 기본 호출 규약
  • 기본 호출 규약이므로 /Gz(stdcall) 또는 /Gr(fastcall) 옵션이 켜졌을 때, 필요한 변수나 함수 이름 앞에 __cdecl을 놓으면 된다.
    /Gd 옵션은 강제로 _cdecl 규약으로 호출한다.

2. __stdcall

  • 인자 파싱 : Right -> Left
  • 스택 관리 : Calle
  • Name Mangling : 함수 이름 앞에 _추가, 함수 이름 뒤에 @추가 되고 @뒤에 다시 매개변수의 전체바이트에 해당하는 10진수가 추가된다.
    ex) _
    Foo@12
  • 거의 모든 시스템 함수에서 사용되는 호출 규칙이다.( WinAPI )
  • /Gz 옵션은 C++멤버 함수와 __cdecl 또는 __fastcall이 표시된 함수를 제외한 모든 함수에 __stdcall 호출 규칙을 지정한다. 모든 __stdcall함수는 프로토타입을 가져야 한다. 가변 인수를 취하는 함수는 __cdecl로 표시해야 한다.

3. __fastcall

  • 인자 파싱 : 처음 2개의 DWORD 또는 더 작은 인자들은 ecx와 edx에 전달, 나머지 인자들은 Right-> Left
  • 스택 관리 : Callee.
  • Name Mangling : 함수 이름 앞과 끝에 @가 추가되고 @뒤에 매개변수의 전체바이트에 해당하는 10진수가 추가된다.
    ex)
    @Foo@12
  • /Gr 옵션은 선언된 함수가 충돌하지 않고 이름이 main이 아니라면, 모듈 내 각 함수를 fastcall로 컴파일 한다.

4. thiscall

  • 인자 파싱 : Right -> Left, this 매개 변수가 ecx레지스터에 전달.
  • 스택 관리 : Caller.
  • Name Mangling : 없음.
  • 가변인자를 허용하지 않는 C++멤버함수의 기본 호출 규약으로 스택 끝에 this포인터를 넣으며 컴파일시 컴파일러에 의해 가변인자 함수는 __cdecl로 변경된다. thiscall은 키워드가 아니므로 thiscall 호출 규약은 명시적으로 사용할 수 없다. 모든 매개 변수들은 스택상에 놓여진다.

5.naked

  • 인자 파싱 : Right -> Left
  • 스택 관리 : Caller
  • Name Mangling : 없음
  • stack frame이 생략.
  • 컴파일러가 기본적으로 만들어주는 Prolog Epilog를 변경할 사용된다. naekd 사용하게 되면 아래와 같은 Prolog Epilog 컴파일러가 생성하지 않는다. 사용자가 stack frame 할당하여 사용해야 된다. 이는 CPU와의 이식성이 없기때문에 일반 응용프로그램에서는 거의 사용되지 않는다. 주로 디바이스 드라이버를 만들 때 사용한다.
저작자 표시
신고
블로그 이미지

Moonistar moonistar

돈 주고 산 도메인을 귀차니즘에 방치하고, 너무 공부를 안한다는 자책감에 올라오는 포스트. ㅋ

함수 호출 규약에 대해서 전에 잠깐 정리해논 자료이다. 선배랑 스터디하면서 설명하기 위해 만든거라,,

허접하고, PPT만 봐서는 뭔 말인지 모를 수도 있겠다. 사실 나도 뭔말인지 모를지도 모른다. ㅋㅋㅋ

Function Calling Convention

물론 이건 책에 있는 내용을 Copy & Paste 신공으로 정리한 것이지만,,, 전보다는 이해하고 있다.

말과 글로 설명을 잘 못해서 그렇지.. ㅎ

함수 호출 규약을 글만 읽어서는 감이 안왔는데,, 잠깐 배운 어셈블리어와 스택 프레임을 보고,,

직접 OllyDbg로 열어서 보니 어느정도 더 이해가 되는 것 같다.

스택 프레임에 대한 내용도 다음 기회에 업로드 해야지. ㅋ

Parameter parsing은 매개 변수를 어떤 것부터 먼저 파싱할 것인가? 에 대한 내용이다.

int test( int a, int b ) 라는 함수가 있을 때, a 부터 먼저 전달할 것인가? b 부터 먼저 전달할 것인가? 를 나타내는 것이다.

Stack management는 하나의 함수가 스택에 저장되었을 때, 그 함수를 호출한 caller가 스택을 정리할 것인가?

그 함수 ( Callee) 가 스스로 정리할 것인가? 에 대한 것이다.

Name Mangling은 기계어로 번역되는 과정에서 어떤 형태로 번역되어 표현되는지 나타내는 것이다.

틀린 것은 강한 태클과 압박 바랍니다. 그래야 잘 못 알고 있는 것을 고치죠 ㅋ
저작자 표시
신고
블로그 이미지

Moonistar moonistar