6

によって生成されたオブジェクト ファイルからエクスポートされたシンボルをデマングルするために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 オブジェクト ファイルからエクスポートされたシンボルをデマングルするにはどうすればよいですか?

4

1 に答える 1