Shinook: Shaddim pretty much took the words right out of my mouth and said it 100x better than I could have.
I don't think most people appreciate how challenging it can be to make a binary-only release that works across multiple Linux distributions or versions of a distribution. I've wrestled with almost all of the issues he's mentioned here, along with a few others he didn't, and all of my "solutions" ended up being hacks.
shaddim: Interesting, another first hand experience. Would you like to elaborate some of the other issues which had arised for you?
The most prominent issue I've encountered was with library/symbol versioning, particularly with glibc, which you cover pretty well. While Ubuntu seems to be fairly up to date with glibc versions, other distros are still using old versions with some fixes ported in and others not.
In cases where I resolved the versioning, I ran into handfuls of other problems. In one case, I encountered a BAD pthreads bug in earlier versions of glibc that had not been fixed in a relatively recent distro. I spent a good day or two trying to figure out what was wrong with my code, when the bug existed in glibc. In other cases, I encountered ABI compatibility issues and crashes that occurred during loading due to changes in the ELF format. I had a few other obscure issues that I don't recall off the top of my head, but those three were the ones that stuck in my mind and occurred the most consistently.
I would imagine these problems become more pronounced as you use libraries that have less consistent APIs and behavior, particularly those with any kind of kernel mode interaction outside of standard system calls. For what I have done, I've only needed to use standardized libraries, so nothing with that type of interaction. In one case, I got tired of trying to deal with finding the right shared object dynamically and just distributed a SO of the problematic library, then dynamically loaded it. There was much swearing that day, because I shouldn't have to do that for a library that's guaranteed to be on the system already.
To be honest, after about a week of trying to get some of my applications to run on multiple distributions, I gave up. I'd resolve one issue, only to have another rear it's head. They are all internal applications, so the solution was to just tell people to run them in a VM if they used a different distro or compile from source. Oddly enough, none of the issues I encountered could really be resolved via code (aside from the pthreads nonsense), almost all of them were related to stuff the compiler did and the ELF format, so compiling from source almost always worked.