有没有 "simple" 方法让 ld 输出 demangle 函数名?
Is there a "simple" way to have ld output demangled funtion names?
由于所有函数名称都被破坏,我发现必须修复链接时发生的 C++ 错误(尤其是未定义的引用错误)非常令人沮丧。损坏名称的示例:
_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv
读起来很难,找到实际功能更难。
有没有办法说服 ld
输出经过修饰的名称?
我用两种方式处理这些问题:
c++filt
命令可以分解东西。
有时使用 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
现在让我们尝试 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
这里-Wl
表示给linker.
的参数
据我所知,g++
会自动启用 demangling。
由于所有函数名称都被破坏,我发现必须修复链接时发生的 C++ 错误(尤其是未定义的引用错误)非常令人沮丧。损坏名称的示例:
_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv
读起来很难,找到实际功能更难。
有没有办法说服 ld
输出经过修饰的名称?
我用两种方式处理这些问题:
c++filt
命令可以分解东西。有时使用 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
现在让我们尝试 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
这里-Wl
表示给linker.
据我所知,g++
会自动启用 demangling。