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

2.7k views Asked by At

I find very frustrating to have to fix C++ errors happening at linkage time (especially undefined reference errors) due to the fact that all the function names are mangled. An example of mangled name:

_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv

It is so hard to read, and finding the actual function is even harder.

Is there a way to convince ld to output demangled names?

2

There are 2 answers

0
Akib Azmain Turja On BEST ANSWER

ld (The GNU Linker) is able to demangle C++ function names. ld documentation on demangling from it's man page: (available here online)

       --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.

Let's see an example:

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

This is a simple valid code. This will compile but fail to link successfully because there is no implementation of foo() and foo(int) here. Now we'll compile it with the following command:

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

It will compile successfully. Now let's try to link it with demangling disabled with the following command:

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

It should show linking errors with some weird mangled name like this:

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

Now let's try to link with demangling enabled with the following command:

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

We'll get errors with demangled function names with their arguments like this:

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

Here -Wl means arguments to linker.

As far as I know, g++ enables demangling automatically.

4
Richard On

I deal with these problems in two ways:

  1. The c++filt command demangles things.

  2. Sometimes compiling with clang rather than gcc, or vice versa, can give insight on compilation issues.

Unfortunately, I'm not sure if it's possible to get demangled output from the linker directly :-(