Media Log

C++에서 함수 이름이 맹글링 되는 것은 다들 알고 있는 사실일 것이다.
링커 오류를 만나게 되면 원인을 분석하기 위해 때때로 함수의 오리지날 이름이 알고 싶을 때가 있다. 마이크로소프트의 도구로 만들어진 함수들에 대해서는 undname 이라는 프로그램이 바로 그런 일을 해준다.

레이몬드 첸의 한 포스트를 읽다가 그는 단순한 함수들에 대해서는 undname을 사용하지 않고도 한눈에 척 알아볼 수 있는 것 같다는 느낌을 받았다.
어떻게 그런 일을 할 수 있는지 알아보다가 강성훈씨가 쓴 이 포스트를 보게 되었다. 그가 말하는 것처럼 아마 현재까지 가장 잘 정리된 자료라는데 동의한다. 어린 나이에 정말 대-_-단 하다고 밖에는 말할 수 없다.

...하지만 나는 한참 살펴보다가 결심했다.
'빌어먹을. 나는 그냥 undname이나 써야겠다.'

흐아, 생각처럼 간단한 일이 아니었다.
그런데 레이몬드 첸은 정말 간단한 함수 정도는 추측할 수 있는 것일까? 아직도 잘 모르겠다.
저작자 표시 비영리 동일 조건 변경 허락
신고
  1. gcd at 2012.02.22 06:38 신고 [edit/del]

    msvc로 mangling 당한 이름에 처음 접했을 때 꽤나 당황했었지요.
    저 룰도 컴파일러마다 다른 모양이라 (거기에다 msvc 9.0부터 규칙-이라기보단 인코딩-이 바뀌었다고 하고...) 링크 시간에 호환이 되긴 하나 하는 의문도 들더라구요.
    여튼, 저 암호(?)를 풀 수 있다는 사실을 알았던건 Dependency walker를 써보면서였군요. 포스트와 다르게 DLL 파일의 export/import된 함수들을 볼 수 있지만, C++ 로 만든(그것도 msvc로 컴파일 한) 몇 비공개 라이브러리에 들어있는 멤버 함수들을 다 볼 수 있어서 신났던 기억이 나네요.

    Reply
    • Favicon of http://www.benjaminlog.com BlogIcon 김재호 at 2012.02.22 10:22 신고 [edit/del]

      저는 9부터 바뀐줄 몰랐습니다. 그런데 그런 걸 바꾸면 부작용이 엄청날텐데. 호환성은 어떻게 맞춰줬을지 궁금하군요.

    • gcd at 2012.02.22 21:19 신고 [edit/del]

      룰이 바뀌었다기보단, 인코딩 처리하는 방법이 ANSI에서 UTF-8로 바뀌었다고 하더라구요.
      대부분 영문 명칭을 쓰기 때문에 임팩트가 거의 없을 것입니다.
      아니, 임팩트가 없었으면 좋겠는데, 8.0 이전에 만든 obj와 이후에 만든 obj 사이에서 가끔 링크 오류가 나긴 하나보더라구요. msvc 8.0용으로 땜빵(?) 패치가 나왔었고(이것도 주로 일본어권의 요구사항으로... 그러고보니 바뀐건 9가 아니라 8부터였네요.) 9.0 이후로는 지원 계획이 없다고 하네요.

      적고보니 mangling이랑 별로 상관 없네요. 헷갈리게 한 것 같아서 죄송합니다.

submit