有没有 "simple" 方法让 ld 输出 demangle 函数名?

Is there a "simple" way to have ld output demangled funtion names?

由于所有函数名称都被破坏,我发现必须修复链接时发生的 C++ 错误(尤其是未定义的引用错误)非常令人沮丧。损坏名称的示例:

_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv

读起来很难,找到实际功能更难。

有没有办法说服 ld 输出经过修饰的名称?

我用两种方式处理这些问题:

  1. c++filt 命令可以分解东西。

  2. 有时使用 clang 而不是 gcc 进行编译,反之亦然,可以深入了解编译问题。

不幸的是,我不确定是否有可能直接从链接器中获得 demangled 输出:-(

ld(GNU 链接器)能够分解 C++ 函数名。 ld 关于从 man 页面上拆解的文档:(在线 here 可用)

       --demangle[=style]
       --no-demangle
           These options control whether to demangle symbol names in error
           messages and other output.  When the linker is told to demangle,
           it tries to present symbol names in a readable fashion: it strips
           leading underscores if they are used by the object file format,
           and converts C++ mangled symbol names into user readable names.
           Different compilers have different mangling styles.  The optional
           demangling style argument can be used to choose an appropriate
           demangling style for your compiler.  The linker will demangle by
           default unless the environment variable COLLECT_NO_DEMANGLE is
           set.  These options may be used to override the default.

让我们看一个例子:

void foo();
void foo(int);
int main() {
    foo();
    foo(5);
}

这是一个简单的有效代码。这将编译但无法成功 link 因为这里没有 foo()foo(int) 的实现。现在我们将使用以下命令编译它:

g++ main.cpp -c -o main.o

编译成功。现在让我们尝试 link 使用以下命令禁用 demangling:

g++ main.o -Wl,--no-demangle

它应该显示 linking 错误,其中包含一些奇怪的损坏名称,如下所示:

main.o: In function `main':
main.cpp:(.text+0x5): undefined reference to `_Z3foov'
main.cpp:(.text+0xf): undefined reference to `_Z3fooi'
collect2: error: ld returned 1 exit status

See live on Coliru

现在让我们尝试 link 使用以下命令启用 demangling:

g++ main.o -Wl,--demangle

我们会收到带有 demangled 函数名称及其参数的错误,如下所示:

main.o: In function `main':
main.cpp:(.text+0x5): undefined reference to `foo()'
main.cpp:(.text+0xf): undefined reference to `foo(int)'
collect2: error: ld returned 1 exit status

See live on Coliru

这里-Wl表示给linker.

的参数

据我所知,g++ 会自动启用 demangling。