views:

345

answers:

3

When I nm on one of my libs:

nm libmylib.so

I get a line like this

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

I checked the man page for nm and I got "U" The symbol is undefined. What does an undefined symbol really mean?

If it is really undefined, then why does nm report it at all?

+2  A: 

An undefined symbol is a symbol that the library uses but was not defined in any of the object files that went into creating the library.

Usually the symbol is defined in another library which also needs to be linked in to your application. Alternatively the symbol is undefined because you've forgotten to build the code that defines the symbol or you've forgotten to include the object file with that symbol into your library.

In your case it looks like a symbol from your implementation's C library so you would expect that to be undefined in your own library. It will be defined in your libc.so wherever that is, possibly /usr/lib.

Troubadour
Looks like a symbol from libstdc++, actually, but yes, you would expect that to be provided for you.
ephemient
@ephemient: Woops, I missed the XX at the end :) Thanks.
Troubadour
A: 

It means that library references that symbol (std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage in this case?) but that it doesn't define it; some part of the program you link it with, or some other library is supposed to do that. If you did mean to define it in your library, it means you didn't link the object file with that symbol's definition with the rest of the library code.

Carl Norum
A: 

I think it means exactly that: undefined in this object. Some symbols are evaluated at run time; this is likely to be one of them.

Ninefingers