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
);