GCC API无法解码自己的导出符号

Kon*_*lph 6 c++ gcc abi name-mangling

我正在尝试使用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()};
}
Run Code Online (Sandbox Code Playgroud)

(省略错误处理;它出现在完整的在线演示中.)

我测试过的符号来自这个小代码:

namespace foo {
    template <typename T>
    struct bar { bar() { } };
}

void baz(int x) { }

template struct foo::bar<int>;
Run Code Online (Sandbox Code Playgroud)

通过g++ -c test.cpp; nm test.o | cut -d ' ' -f3:

EH_frame1
__Z3bazi
__ZN3foo3barIiEC1Ev
__ZN3foo3barIiEC2Ev
Run Code Online (Sandbox Code Playgroud)

我不确定GCC demangling API的目的是什么,如果它不能解码这些符号 - 它可以成功地解码C++ typeid表示.例如,在测试代码中写入typeid(foo::bar<int>*).name()将产生PN3foo3barIiEE,这反过来被上述函数正确地解码.

难道我做错了什么?如何从GCC对象文件中对导出的符号进行解码?

Pup*_*ppy 3

您的符号前面有太多下划线。我不知道为什么,但如果你检查C++filtjs,它会报告同样的事情 - 它们不是有效的 Itanium ABI 符号,前面有两个下划线,但只有一个。在这种情况下,我会说 的输出nm不正确,而不是 demangle 函数错误。Itanium ABI 指定并且我知道 Clang 仅使用一个下划线。

你知道,它确实说了一些我现在几乎可以读懂 Itanium ABI 损坏的名称的内容。阅读 Clang 的 LLVM IR 输出的时间太多了。