The UN*X utility nm prints the list of names referenced in an object file or library. It can typically report names defined in the object file and names external to the file, which must be linked in by some linker. It should also be able to demangle any C++ name mangling.
All nms I've seen within the last 7-8 years, at least have been able to grok .o files (object files), .a files (libraries, or ar code archives), and .so files (shared libraries, or shared object files). For archives, nm can typically also report the internal object file for each name.
"Names" here are any symbol that would be called extern in C or C++. Usually C and C++ names are prefixed with an underscore "_"; nm does not strip this.
One nice feature (of the file formats used more than of the program) is that nm can report symbol names from stripped files as well as from files with debug information.
A useful use of nm is to help resolve linking problems. When faced with 100 different libraries, nm is often the quickest way to answer the question "which library defines function xyzzy?".