카테고리 없음

C++ Demangling (함수, 변수이름 심볼 인코딩 복원하기)

JUNFUTURE 2026. 4. 10. 13:50

Demangling은 C++ 컴파일러가 함수나 변수 이름을 링크용 심볼로 인코딩한 것을 사람이 읽을 수 있는 원래 이름으로 복원하는 과정이다.

 

C++은 함수 오버로딩, 네임스페이스, 클래스, 템플릿 같은 정보까지 심볼에 담아야 하므로, 예를 들어
MyApp::Renderer::instance() 같은 이름이 바이너리에서는
__ZN5MyApp8Renderer8instanceEv 처럼 mangling된다.

 

이 인코딩된 이름을 다시 원래 C++ 형태로 푸는 작업이 demangling이다.

직접 해보면:

echo "__ZZN5MyApp8Renderer8instanceEvE6object" | c++filt
=> MyApp::Renderer::instance()::object
 
 

해석해보면:

  • _ZN → namespace / class 스코프 시작
  • 5MyApp → "MyApp" (숫자는 문자열 길이)
  • 8Renderer → "Renderer"
  • 8instanceEv → instance() (v는 void 인자)
  • _ZZ...E6object → 함수 내부의 static local 변수 object
  • _ZGV... → 해당 static 변수의 초기화 여부를 관리하는 guard variable

 

즉, demangling은 디스어셈블리나 심볼 분석 중 보이는 난독화된 C++ 심볼을 원래의 함수/변수 선언 형태에 가깝게 복원하는 작업이라고 보면 된다.

 

아 신기하다 진짜