prosource

DLL의 내보낸 기능의 네임 망글링을 중지하려면 어떻게 해야 합니까?

probook 2023. 9. 25. 22:49
반응형

DLL의 내보낸 기능의 네임 망글링을 중지하려면 어떻게 해야 합니까?

GetName이라는 함수를 내보내는 DLL을 만들려고 합니다.나는 다른 코드가 이 함수를 굳이 망가지지 않아도 호출할 수 있기를 바랍니다.

내 헤더 파일은 다음과 같습니다.

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT TCHAR * CALLBACK GetName();

내 코드는 다음과 같습니다.

#include <windows.h>
#include "PluginOne.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
     return TRUE ;
}

EXPORT TCHAR * CALLBACK GetName()
{
    return TEXT("Test Name");
}

빌드해도 DLL은 "_GetName@0"이라는 이름으로 함수를 내보냅니다.

내가 뭘 잘못하고 있는 거지?

작은 수정 - 클리넷별 성공적인 해결

extern "C"

수입과 마찬가지로 수출 쪽에 있어야 합니다.

외부 "C"는 프로시저 이름을 "_GetName"(_GetName)로 바꿉니다.

또한 .def 파일에서 섹션 내보내기의 도움을 받아 어떤 이름이든 강제로 사용할 수 있습니다.

이는 DLL 내보내기에서 일반적인 현상입니다.__stdcall인습. 더@N 함수가 인수에서 사용하는 바이트 수를 나타냅니다(사용자의 경우 0).

DLL에서 내보내기의 MSDN 페이지에는 "함수의 정의에서 키워드 __declspec(dllexport)"를 사용할 때 "_stdcall 호출 규약을 사용하라"고 명시되어 있습니다.

정답은 다음과 같습니다.

extern "C" int MyFunc(int param);

그리고.

int MyFunc(int param);

는 서로 다른 내부 이름을 사용하는 두 개의 선언입니다. 첫 번째는 C 스타일, 두 번째는 C++ 스타일입니다.

C++는 더 복잡하기 때문에(oop, 오버로드, 가상 함수 등) 빌드 도구가 어떤 인수를 받고 어떤 유형이 반환되는지 등을 결정하는 데 필요한 내부 명명법입니다. C++는 더 복잡한 명명법을 사용합니다. 호출 규칙은 또한 c와 c++ 명명법 모두에 영향을 미칩니다.

동일한 방식으로 __ declspec(dllexport)을 사용할 때는 이 두 가지 방식의 이름 지정이 모두 적용됩니다.

내보낸 루틴의 이름 망글링을 생략하려면 프로젝트에 모듈 정의 파일을 추가하고 입력합니다(이 경우에는 decspec dlexport를 수행할 필요가 없습니다.

LIBRARY mylib
EXPORTS
  MyFunc

명시적인 이름 장식은 생략합니다(아래 samples).

_MyFunc (c style, __cdecl)
_MyFunc@4 (c style, __stdcall)
?MyFunc@@YAHH@Z (c++ style, __cdecl)
?MyFunc@@YGHH@Z (c++ style, __stdcall)

"-Wl,--kill-at" 링커 스위치를 사용하여 이름 망글링을 비활성화할 수 있습니다.

예를 들어 코드::블록, 사용자 지정 링커 설정에서 다음을 추가합니다. -Wl,--kill-at

언급URL : https://stackoverflow.com/questions/1467144/how-do-i-stop-name-mangling-of-my-dlls-exported-function

반응형