x64 빌드에서 extern "C"가 아닌 경우 __cdecl name mangling 적용
처음 알았군요. ^^; 간단하게 DLL 프로젝트를 만들어, 다음의 헤더 파일과 CPP로,
// 헤더 파일
__declspec(dllexport) int __stdcall fnDll1(void);
extern "C" __declspec(dllexport) int __stdcall fnDll2(void);
#include "pch.h"
#include "Dll1.h"
__declspec(dllexport) int __stdcall fnDll1(void)
{
return 0;
}
__declspec(dllexport) int __stdcall fnDll2(void)
{
return 0;
}
빌드한 결과물에 대해 export 결과는 다음과 같습니다.
[x86]
?fnDll1@@YGHXZ
_fnDll2@0
[x64]
?fnDll1@@YAHXZ
fnDll2
extern "C"가 붙지 않은 fnDll1에 대해 각각
undname으로 풀어 보면,
// Visual C++ name mangling
// ; https://en.wikiversity.org/w/index.php?title=Visual_C%2B%2B_name_mangling&oldid=2371121
[x86]
?fnDll1@@YGHXZ ==> int __stdcall fnDll1(void)
[x64]
?fnDll1@@YAHXZ ==> "int __cdecl fnDll1(void)"
x64의 경우, __stdcall을 명시한 것에 상관없이 __cdecl로 나옵니다. (업데이트 2020-11-20) x64의 경우, extern "C"가 없는 경우 name mangling이 무조건 __cdecl 유형으로 나옵니다. (버그인지, 원래 이런 것인지 혹시 아시는 분은 덧글 부탁드립니다. ^^)
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]