LoginSignup
1
2

More than 5 years have passed since last update.

Windows環境で右辺値参照を含むシンボル名をUnDecorateSymbolName関数でデマングリングできない問題

Last updated at Posted at 2018-09-10

Windows環境(MSVC)でデマングリングする場合、UnDecorateSymbolName関数を使う(使っていた)が、前の投稿で調べていたら右辺値参照(&&)を含むシンボルがデマングリングされないことに気づいた。

Visual Studio 2017に付属している undname.exe は(当然)デマングリングできる。

undname.exe でのやり方

undname.exe を dumpbin.exe でみると、VCRUNTIME140.DLL に存在する __unDNameEx をインポートしている。

__unDNameEx/__unDName とは

MSDNを見ても、内部関数であること以外は特に情報はない。
Visual Studio 2017に付属しているソースコード(crt\src\vcruntime\undname.cxx)を参照すると、以下のシグニチャを持っているようだ。

名前が __UNDNAME_NAME/__UNDNAME_NAME_EXとなっているが、多分マクロで置き換わるのであろう。

(ちなみにインクルードしている "undname.hxx" は私の環境では見当たらない)

pchar_t __UNDNAME_IMP __cdecl __UNDNAME_NAME(
    _Out_opt_z_cap_(maxStringLength) pchar_t outputString,
    pcchar_t name,
    int maxStringLength,
    Alloc_t pAlloc,
    Free_t pFree,
    unsigned short disableFlags

)
...

pchar_t __UNDNAME_IMP __cdecl __UNDNAME_NAME_EX(
    _Out_opt_z_cap_(maxStringLength) pchar_t outputString,
    pcchar_t name,
    int maxStringLength,
    Alloc_t pAlloc,
    Free_t pFree,
    GetParameter_t pGetParameter,
    unsigned long disableFlags

)
...

unDNameEx/unDName を呼び出す。

デマングするコードで、下記の宣言を加えた。

最後の引数の disableFlags は、多分 UnDecorateSymbolName と同じフラグを指定する。

ランタイムとスタティックリンクする場合はよくわからん。

typedef char *        pchar_t;
typedef const char *  pcchar_t;

typedef void * (__cdecl * Alloc_t)(size_t);
typedef void   (__cdecl * Free_t )(void *);

EXTERN_C pchar_t _VCRTIMP __cdecl __unDName(
        _Out_opt_z_cap_(maxStringLength) pchar_t outputString,
        pcchar_t name,
        int maxStringLength,
        Alloc_t pAlloc,
        Free_t pFree,
        unsigned short disableFlags
    );
EXTERN_C pchar_t _VCRTIMP  __cdecl __unDNameEx(
        _Out_opt_z_cap_(maxStringLength) pchar_t outputString,
        pcchar_t name,
        int maxStringLength,
        Alloc_t pAlloc,
        Free_t pFree,
        void* pGetParameter,
        unsigned long disableFlags
    );
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2