네임 맹글링
네임 맹글링(Name mangling), 또는 이름 장식(Name decoration)은 컴파일러나 어셈블러가 프로그램 내에서 사용되는 변수나 함수의 이름을 컴파일 후의 목적 코드에서 다른 이름으로 변환하는 과정을 말한다. 이는 주로 프로그래밍 언어가 함수 오버로딩, 네임스페이스, 클래스 등의 기능을 지원할 때 발생하며, 링크 시 이름 충돌을 방지하고, 컴파일러가 올바른 함수나 변수를 찾을 수 있도록 돕는 데 목적이 있다.
목적
네임 맹글링의 주요 목적은 다음과 같다.
- 이름 충돌 방지: 서로 다른 네임스페이스나 클래스에 동일한 이름의 함수 또는 변수가 존재할 경우, 링커는 어떤 것을 사용해야 할지 결정할 수 없게 된다. 네임 맹글링은 컴파일 단계에서 이름을 고유하게 만들어 이러한 충돌을 해결한다.
- 오버로딩 지원: C++과 같은 언어는 동일한 이름의 함수를 여러 개 정의하는 함수 오버로딩을 지원한다. 이 때, 함수의 매개변수 타입이나 개수가 다르면 컴파일러는 네임 맹글링을 통해 각 함수에 고유한 이름을 부여하여 구분한다.
- 타입 안전성 확보: 네임 맹글링은 컴파일러가 함수 호출 시 올바른 타입의 인자가 전달되었는지 검사하는 데 도움을 줄 수 있다. 맹글링된 이름에는 타입 정보가 포함될 수 있기 때문이다.
작동 방식
네임 맹글링은 컴파일러마다 구현 방식이 다를 수 있지만, 일반적으로 다음과 같은 정보를 기반으로 새로운 이름을 생성한다.
- 함수/변수 이름: 원래의 이름이 기본적으로 포함된다.
- 네임스페이스/클래스 이름: 해당 함수/변수가 속한 네임스페이스나 클래스 이름이 접두사 형태로 추가될 수 있다.
- 매개변수 타입: 함수의 경우, 매개변수의 타입 정보를 맹글링된 이름에 포함시킨다.
- 반환 타입: 함수의 반환 타입 정보 또한 맹글링에 사용될 수 있다.
- 호출 규약: 함수 호출 방식 (cdecl, stdcall 등)에 대한 정보가 추가될 수 있다.
예시
C++에서 다음과 같은 함수가 정의되었다고 가정해보자.
namespace MyNamespace {
int add(int a, int b);
}
이 함수는 컴파일러에 따라 다음과 같이 맹글링될 수 있다. (예시이며, 실제 맹글링 결과는 컴파일러에 따라 다르다.)
?add@MyNamespace@@YAHHH@Z
이 맹글링된 이름은 "MyNamespace" 네임스페이스 안에 있는 "add" 함수이며, 두 개의 정수형 인자를 받고, 정수형 값을 반환한다는 정보를 담고 있다.
주의 사항
네임 맹글링은 컴파일러에 의존적인 기능이므로, 서로 다른 컴파일러로 컴파일된 코드를 링크할 때 호환성 문제가 발생할 수 있다. 특히, C++로 작성된 라이브러리를 다른 언어(예: C)에서 사용하려는 경우, 네임 맹글링 문제를 해결해야 할 수 있다. 이 경우, extern "C"
키워드를 사용하여 C 스타일의 이름으로 함수를 정의하면 맹글링을 방지할 수 있다.