최신목록

2016년 12월 1일 목요일

[C/C++]Name Mangling 과 calling convention

c 로 static library를 하나 만들고 c project에서 함수를 call 하는 상황에서 당연히 Name Mangling 문제가 없어야 하는데...
library에 분명 해당 함수가 존재하는데도 함수 호출시 외부 기호에서 확인하지 못했다는 링크 에러가 발생했다.

dumpbin을 사용하여 library에서의 함수 이름을 확인했더니
_test 라고 되있고 호출할때 에러에서는 _test@0 이라고 호출을 하고 있다.

Mangling 문제가 발생하였다...음...뭘까요?

XXX@0 이거는 C++에서 Name Mangling 이 적용된거 같은데....
자세히 보면 또 Name Mangling 치고는 또 너무 단순하다.
보통은 XXX@IHKGDA 뭐 이런식으로 좀 더 복잡해야하는데...

원인은 __stdcall과 __cdecl 의 차이였다.
C형식으로 잘 컴파일 되었으나 __cdecl형식으로 dll export시는 함수 이름이 그대로 생기고
__stdcall로 dll export시는 XXX@N 이런식으로 뒤에 숫자가 더 붙었다.

아래는 teststdcall 함수를 __stdcall 형식으로 export 하고 testcdecl 함수를 __cdecl 형식으로 export 하여 두개의 library 안에서의 Naming을 dumpbin을 이용하여 확인하였다.



teststdcall함수는 teststdcall@0로 이름이 생기고 testcdecl 함수는 testcdecl 그래도 이름이 되있음을 볼수 있다. calling convention의 차이가 심볼이름에도 영향을 미치고 있었다.

댓글 없음:

댓글 쓰기