반응형

Name Mangling

프로그램에서 함수를 선언하거나 전역 변수 등을 선언 했을 때, 실제 생성되는 함수는 컴파일 단계에서 일정한 규칙을 가지고 변경되는데, 이를 네임 맹글링(Name Mangling)혹은 네임 데커레에션(Name Decoration)이라 부른다.

이러한 작업은 Linker가 다른 Scope에 있는 같은 이름의 함수와 변수에 대해 구별할 수 있도록 하는 요소이므로, Compiler 입장에서는 중요한 작업이다.


일반적으로 Compiler 는 함수에 대해서 그 함수의
이름과 함수의 파라미터 타입 그리고 Calling Convention등을 사용하여 그 이름을 만들어 내게 된다
.

이러한 네임 맹글링은 컴파일러 마다 다른 규칙을 가지게 된다
.

외부라이브러리를 링크하여 컴파일 할때 선언부만 포함하고 실 라이브러리를 포함하지 않으면 발생하는 에러에서 간혹 보게 되는
?TestFunc1@@YAXHPAH@Z와 같은 형태의 함수이름이 네임 맹글링된 함수의 이름이다
.

* C++
로 작성되는 프로그램에서 함수 앞에 붙이는 extern "C" 선언은 함수를 컴파일 할 때, 네임 맹글링을 하지 않고 함수이름만으로 네이밍 하도록 한다(즉 C type으로 함수명을 네이밍하게 된다).

아래의 예에서 extern "C"를 기술했을 경우와, 그렇지 않은 경우의 차이를 확인 할 수 있다.

 

 extern "C" __declspec(dllexport) void TestFunc( int x);

 

__declspec(dllexport) void TestFunc( int x);



* "UNDNAME" 유틸리티를 이용하여 네임 맹글링된 함수의 선언을 확인 할 수도 있다.

(이 유틸리티는 Visual Studio 설치폴더 C:\Program Files\Microsoft Visual Studio x.x\VC\bin 에서 찾을 수 있으며, 파일로 첨부한다.)

 

위에서 생성된 함수를 UNDNAME.exe를 이용해 데코레이션을 제거하면 예상대로 아래와 같이 표시된다.


 

* 이러한 이유 때문에 정적으로 링크하여 사용할 것이 아니라면
   - 즉,
   - LoadLibrary(), GetProcAddress()의 절차를 통해 함수포인터를 얻어 사용하거나,
   - 다른 언어로 작성된 Application에서 Dll을 로드하여 사용
할 용도의 Dll이라면 export되는 함수에 대해 함수의 export선언부에 
extern "C"를 붙여주거나 .def파일을 이용해서 네임맹글링이 적용되지 않도록 하여야 한다.

 

반응형

+ Recent posts