によって生成されたオブジェクト ファイルからエクスポートされたシンボルをデマングルするために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()
と が生成PN3foo3barIiEE
され、これは上記の関数によって正しくデマングルされます。
私は何か間違ったことをしていますか?GCC オブジェクト ファイルからエクスポートされたシンボルをデマングルするにはどうすればよいですか?