The binutils package is a set of binary tools, described by the readme for the GNU version as, "a collection of various GNU compilers, assemblers, linkers, debuggers, etc., plus their support routines, definitions, and documentation." That description, sans the GNU reference, is valid for most vendor's versions of the collection.
Most major Unix variants
as well as Wintel
systems have a version of the binutils packages, and their main reason for existence is to give systems the ability to compile and link programs.
The following programs traditionally make up the binutils collection. My experience is primarily with the GNU versions of these utilities; I've tried to include information on differences with other versions, where I am aware of them. If you have more information, please send me a message and I'll expand this writeup.
A linker. Most major vendors have their own versions of ld. The GNU version ("GNU ld") is known for having numerous options, although it has traditionally not been compatible with commercial linkers.
An assembler. The primary function of 'as' is to assemble the output of a compiler for use by the linker. Quoting from the FreeBSD documentation for the GNU version, "...'as' is really a family of assemblers. If you use (or have used) the GNU assembler on one architecture, you should find a fairly similar environment when you use it on another architecture. Each version has much in common with the others, including object file formats, most assembler directives (often called "pseudo-ops)" and assembler syntax."
The "address-to-line" tool. Converts addresses into filenames and line numbers. Quoting from the manpage, "given an address and an executable, it uses the debugging information in the executable to figure out which file name and line number are associated with a given address."
A utility for creating, modifying, and extracting from archives. "ar is considered a binary utility because archives...are most often used as libraries holding commonly needed subroutines."
A filter to demangle encoded C++ symbols. "All C++ and Java function names are encoded into a low-level assembly label (this process is known as mangling)." c++filt makes sure that overloaded fuctions with the same name in your C++ or Java program don't clash when the linker references them.
Coverts object code into an NLM -- a NetWare Loadable Module. Not always part of the binutils package, as it's only useful for NLM systems. The NLM Software Developer's Kit ("NLM SDK"), available from Novell, which contains more information on NLM executables and how they work, is available at http://developer.novell.com/netware/.
Lists symbols from object files. For each symbol, nm shows the symbol's value, type, and name.
Copys and translates object files from one object file to another; the destination file can be in a different format from the source file.
Displays information from object files. The man page for the GNU version says that, "this information is mostly useful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.
Generates an index to the contents of an archive. Again quoting from the GNU man page, "the index lists each symbol defined by a member of an archive that is a relocatable object file...an archive with such an index speeds up linking to the library and allows routines in the library to call each other without regard to their placement in the archive."
Displays information from any ELF format object file. Depending on the arguments passed when readelf is called, it will display the information contained in the ELF header at the start of the file, the information contained in the file's segment headers and/or section headers, the entries in the symbol table (and possibly a histogram of bucket list lengths when displaying them), all the headers, the contents of the NOTE segment, relocation section, unwind section, or in the dynamic section.
Lists the section sizes -- and possibly the total size -- for each of the object or archive files passed via its argument list.
Lists printable strings from files. For each filename passed on the command line, "GNU strings prints the printable character sequences that are at least 4 characters long (or the number given with the options below) and are followed by an unprintable character."
Discards symbols from each filename passed on the command line. Stripping an executable can sometimes drastically reduce its size.
May be used to manipulate Windows resource files. Like nlm, it is not always part of the binutils package, as it's only useful for windows targets.
Not sure if this counts as a cut-and-paste writeup; although I quote liberally from the GNU documentation, I think that a single list of what the binutils package is and what each of the programs do from a high-level point of view is a valuable resource.