카테고리 없음

내 DLL의 내보낸 함수의 이름 변환을 어떻게 멈출 수 있을까요?

스택큐힙리스트 2023. 11. 17. 10:38
반응형

저는 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(테스트 이름);
}

빌드할 때 DLL은 여전히 _GetName@0이라는 이름으로 함수를 내보냅니다.


무엇이 잘못되었을까요?

답변 1

작은 수정 - 클라이언트에 의해 이름이 성공적으로 해결되기 위함


extern C

는 수출 측면과 수입 측면에서도 동일해야합니다.


extern C는 프로시저의 이름을 _GetName으로 줄일 것입니다.


.def 파일의 EXPORTS 섹션의 도움으로 어떠한 이름도 강제로 지정할 수 있습니다.

답변 2

이름 오픈커넥제브의 DLL 내보내기된 함수의 이름 손상을 막으려면 어떻게 해야 할까?
DLL은 동적 링크 라이브러리(Dynamic Link Library)의 약자로, 여타 프로그래머들이 사용할 수 있는 함수와 데이터의 집합입니다. DLL을 만들 때는 함수와 변수의 이름을 잘 지정하여 사용자들이 쉽게 활용할 수 있도록 해야 합니다. 그러나 일부 컴파일러에서는 C++ 언어의 경우 함수 이름을 일련의 규칙에 따라 변형하여 맹글링하는 경우가 있습니다.
DLL에서 맹글링된 함수 이름을 복원하기 위해서는 다음과 같은 몇 가지 방법을 적용할 수 있습니다.
1. C 스타일로 함수를 정의하기: C 언어는 함수 이름의 맹글링을 하지 않습니다. 그러므로 함수를 C 스타일로 정의하면 맹글링의 영향을 받지 않게 됩니다.
2. extern C 디렉티브를 사용하기: C++에서도 C 스타일로 함수를 정의할 필요는 없습니다. 함수의 선언 부분에 extern C 디렉티브를 추가하면 해당 함수는 C 스타일로 해석됩니다.
3. 컴파일 옵션 변경하기: 일부 컴파일러는 맹글링을 비활성화하는 옵션이 제공될 수도 있습니다. 컴파일 시 옵션을 변경하여 맹글링을 비활성화할 수 있는지 확인해보세요.
이렇게 하면 DLL의 함수 이름이 맹글링되는 것을 방지할 수 있습니다. 하지만 주의해야 할 점은 DLL에서 외부로 공개해야 하는 함수가 많은 경우, 함수 이름이 충돌할 수 있어야 합니다. 이럴 경우에는 네임스페이스나 함수명에 접두사를 추가하여 충돌을 방지할 수 있습니다.
DLL 함수 이름의 맹글링에 대한 이해와 대응책을 알아두면, 프로그래머들간의 협업이나 개발 환경 간의 호환성을 향상시킬 수 있습니다. DLL을 사용하는 다른 개발자들이 쉽게 접근하고 활용할 수 있도록 자세한 함수명 작성에도 신경 써야 합니다. DLL을 개발하는 개발자라면 꼭 이러한 사항들을 기억하면서 코드를 작성하시기 바랍니다.

반응형