如何获取IDiaSymbol的原始修饰名?助力SymbolSort符号匹配
获取IDiaSymbol的修饰后真实名称(与目标文件/链接器一致)
你要的是链接器实际识别、目标文件中存储的原始修饰(mangled)名称,其实不用绕弯子调用get_undecoratedNameEx——这个函数的作用刚好相反,是把修饰名转换成不同格式的未修饰可读名称,你传入的参数还进一步限制了转换规则,难怪会返回奇怪的无效结果。
正确的做法:直接调用IDiaSymbol::get_name()
get_name()方法返回的就是符号的原始修饰名称,完全和目标文件、链接器看到的一致。这才是你用来和目标文件符号做匹配的正确值。
示例代码:
std::string mangledName; HRESULT hr = diaSymbol->get_name(&mangledName); if (SUCCEEDED(hr)) { // 这里的mangledName就是你需要的、与目标文件一致的修饰名称 }
为什么你之前的方法会出错?
你用的get_undecoratedNameEx是用来控制未修饰名称的输出格式的,比如你传入的UNDNAME_32_BIT_DECODE | UNDNAME_TYPE_ONLY参数,是告诉函数只解析类型信息、按32位规则处理未修饰转换——这和你要获取修饰名称的需求完全相悖,所以才会出现类似?? :: ?? ::Z::_N_N000 & __ptr64 volatile这种混乱的输出。
补充说明
如果遇到get_name()返回空或不符合预期的情况,可以先通过get_symTag()检查符号类型,确认你处理的是链接器可见的符号(比如函数SymTagFunction、全局变量SymTagData等)——有些符号类型(比如局部变量)可能不会有链接器可见的修饰名称,但这类符号本来也不需要和目标文件做匹配。
内容的提问来源于stack exchange,提问作者stgatilov
相关产品推荐
相关产品推荐

