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++ 심볼을 원래의 함수/변수 선언 형태에 가깝게 복원하는 작업이라고 보면 된다.
아 신기하다 진짜