(최종 업데이트: 2014-03-15 11:59 - 아래 링크 이미지가 다 깨져서 구글 검색으로 찾아 새로 올림 ^O^)


Calling Convention, 우리 말로 "함수 호출 규약".


C/C++ 개발자라면 누구나 알아야 할 것 같은 이 개념들은,

사실 일반적인 C/C++ 프로그래밍에서는 다룰 일이 거의 없다.

대부분의 프로그래밍이 그렇듯, 사용자가 작성한 코드를 컴파일해서 실행하는 경우에는 이것이 무엇이고 어떤 경우에 알아야 하는지 알 필요가 없단 말이다. 그냥 컴파일해서 실행하면 될 뿐. C#, Java 등 기타 고급 언어인 경우에는 두 말할 필요도 없다.


이것이 뭔지 알 필요가 있는 경우는 딱 한 가지 뿐이다. 바로 남이 만든 DLL을 참조해서 호출해야 할 때.

여기서 남이란 Windows 자체 API일수도 있고, 제3사에서 만든 API일수도 있다.


그런데, COM으로 만들어진 DLL이라면 역시 알 필요가 없다.

표준 DLL로 만들어진 경우에만 Calling Convention에 대한 지식이 필요하다.

그만큼 일반적이지 않고 제한적이며 전문적인 지식이란 얘기다.

(또 Reverse Engineering에서 어셈블리를 파려면 반드시 알아야 하는 지식이기도 하다.)



서론이 길었는데,



간략 정리된 블로그 포스팅이 있어 Calling Convention 자체에 대한 상세한 내용은 직접 언급하지 않고 링크로 대체한다.(^^;;; 이건 뭐... 직접 쓰려고 했는데, 아래 링크들보다 더 잘 쓸 수는 없을 것 같아 포기.)


링크: [C/C++] Function Calling Conventions에 대한 정리 이거 하나로 끝낸다!! (http://recoverlee.tistory.com/25)




Calling Convention에 따른 스택 프레임과 스택 포인터의 이동에 관해서는 아래의 블로그에 자세히 설명되어 있다.


링크1: 함수 호출 규약, Function Calling Convention (1/2) (http://beforu.egloos.com/2117375)

링크2: 함수 호출 규약, Function Calling Convention (2/2) (http://beforu.egloos.com/2117409)



정리해서 말하자면, Calling Convention은 함수 호출이 끝난 후 스택을 어떻게 정리하느냐의 관점에 따라 나뉘어진 규약이다.

(스택을 제대로 정리하지 않으면 치명적인 메모리 참조 오류가 발생해서 프로그램이 죽는다.)


다행히 모든 호출 규약의 공통점은 함수 파라미터를 뒤에서부터 스택에 적재한다는 점이다. 앞의 몇 개를 레지스터에 넣느니 마느니 하는 사소한 차이점은 있지만 어쨌든 스택에 적재하는 순서는 맨 뒤의 파라미터부터라는 점...


스택 프레임을 만들고 해제할 때 사용되는 프롤로그, 에필로그는 어셈블리 및 리버스 엔지니어링에서 굉장히 중요한 개념이지만 C/C++ 프로그래밍의 범주에서는 크게 신경쓸 필요 없다. 그냥 그런 게 있다 정도만 알면 된다. C/C++ 개발자가 프롤로그, 에필로그를 알아야 하는 경우는 naked 방식의 함수를 만들 경우뿐인데... 내가 보기엔 디바이스 드라이버 관련 프로그래머나 리버스 엔지니어로 코드 인젝션을 할 때 정도 외엔 없다.




Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]