Notice
Recent Posts
관리 메뉴

Hacking Arts

함수 호출 규약(Calling Convention) 본문

Programing/ETC++

함수 호출 규약(Calling Convention)

Rakehell 2014. 9. 28. 00:26

-함수 호출 규약 : 함수를 호출할 때 파라미터를 어떤 식으로 전달하는가?에 대한 약속이다. 함수 호출전에 파라미터를 스택을 통해서 전달된다. 그리고 함수 호출 후에 ESP를 어떻게 정리하는지 에 대한 약속이 바로 함수 호출 규약이다.


- Caller 와 Callee : Caller는 함수 호출한 쪽이고 Callee는 함수 호출을 받는 쪽이다. 설명하자면 main함수에서 scanf나 printf함수를 호출하는 경우 Caller는 main함수가 될테고 scanf나 printf는 Callee가 된다.


- cdecl : C언어에서 주로 사용되며 Caller에서 스택을 정리하는 특징을 가진다. 그리고 가장 주요 특징은 C언어의 printf같이 가변 길이의 파라미터를 전달할 수 있다는 점이다. C언어에서는 기본적으로 cdecl을 사용한다.


- stdcall : Win32 API에서 사용되며, Callee에서 스택을 정리하는 것이 특징입니다. Win32 API는 C언어로 된 라이브러리이지만 기본 cdecl방식이 아닌 stdcall을 사용하는데 C이외의 다른 언어에서 API를 직접 호출할 때 호환성을 좋게 하기 위한 것입니다.


- fastcall : 기본적으로 stdcall과 같지만, 파라미터 일부(2개)는 ECX,EDX 레지스터에 저장되어 전달되지만 ECX와 EDX를 사용하지 못하는 점 그리고 기존에 중요한 값이 있다면 백업되어야 된다는 점에서 단점이 생길 수 도 있습니다.


- 리눅스의 경우 모두 Caller가 스택을 치우기 때문에 나뉘지 않는다고 합니다.


-참고

http://tydud.tistory.com/entry/20140818

https://kldp.org/node/39210