我正在尝试使用GCCabi::__cxa_demangle
对从由g++
. 但是,我总是得到错误
mangled_name不是 C++ ABI 重整规则下的有效名称
这是我调用该函数的方式:
std::string demangled(std::string const& sym) {
std::unique_ptr<char, void(*)(void*)>
name{abi::__cxa_demangle(sym.c_str(), nullptr, nullptr, nullptr), std::free};
return {name.get()};
}
(省略了错误处理;它出现在完整的在线演示中。)
我测试它的符号是从这个小代码中获得的:
namespace foo {
template <typename T>
struct bar { bar() { } };
}
void baz(int x) { }
template struct foo::bar<int>;
通过g++ -c test.cpp; nm test.o | cut -d ' ' -f3
:
EH_frame1
__Z3bazi
__ZN3foo3barIiEC1Ev
__ZN3foo3barIiEC2Ev
如果不能对这些符号进行解组,我不确定 GCC 解组 API 的用途是什么——但是,它可以成功地对 C++typeid
表示进行解组。例如,在测试代码中编写typeid(foo::bar<int>*).name()
会 yield PN3foo3barIiEE
,而这又会被上述函数正确地分解。
难道我做错了什么?如何从 GCC 目标文件中解开导出的符号?