1) C++ ABI
The C++ ABI generated by GCC version 2.95, 2.96, 3.0, and 3.1.1 are
incompatible with each other. This means that, for examples, apps compiled
with GCC 2.95 cannot link to libraries compiled with GCC 3.2.

GCC 3.2 is the latest ABI. The GCC team promised to not break the ABI
again, unless there's a bug in the current ABI which prevents correct
compilation of standards-compliant ISO C++ code. Also, all modern
Linux distributions (RedHat 8+, Mandrake 9+, etc.) are compiled using GCC
3.2 So you should generally compile all your C++ binaries using GCC 3.2.

2) Symbol collisions, be aware of what libraries are implicitly linked in.
Imagine the following situation:
- foo contains the symbol foobar (a function).
- libbar contains a symbol with the same name, but is a totally different
  function.
- foo is linked to libbar.
When foo tries to call foobar(), it's undefined whether it will call the
foobar() from it's own binary, or the one from libbar. Depending on what
those functions do, foo may crash or do something it isn't supposed to do.

Solution: rtld features, -Bgroup. However, at this moment these are not
supported by glibc. Until they are, keep these in mind:
- You should mark all functions that you do not want to export (or show up
  in the symbol table) as static.
- If you're a library, you should namespace all functions.
- Internal functions that are used within a library, but across multiple
  .c files, should be prefixed by a _ or __.

3) Linking against shared versions of X11 extension libs

4) Usage of sys_errlist

5) Don't use TLS (__thread).
