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의 차이가 심볼이름에도 영향을 미치고 있었다.
댓글 없음:
댓글 쓰기