Nobody said:
That's only really true for "core" libraries, e.g. libc. Once you get up
to higher levels (e.g. X and GUI toolkits), the ABIs can change quite
frequently.
To be a little pedantic, things like X and gui toolkits are not part of
Linux - the comment was about the Linux API (and I presume you mean
"API", not "ABI" - i.e., the interface for calling system functions from
languages like C, rather than the low-level specification for C function
calling conventions).
But more generally, the situation is fairly similar with these sorts of
libraries - they get extended, but there are not often major
incompatible changes. What changes is often catered by the standard
"./configure" process, and when necessary Linux installations have
copies of the various versions of the libraries.
Anything which uses C++ tends to be especially fragile, partly due to
extensive use of structures (objects), partly due to the amount of inlined
code (which often relies upon structure layout and won't change along with
non-inlined functions in the library).
I'm not sure how valid that is - but it's also worth remembering that in
the world of open source, source code compatibility is more important
than binary compatibility. A great many binary incompatibilities can be
resolved by a simple recompile - standard practice when making a new
version of a Linux distribution, but alien to the world of windows
programming.
IOW, a five year old binary will run on a five year old OS distribution.
If you want to run it on a newer distribution, you need to start chasing
down all of the five-years-ago versions of the libraries that it uses.
In the cases where that is necessary, distributions often have these
five year old libraries in their repositories.
It isn't so much the syntax of the calls (even a fairly slack programmer
can figure out that changing the argument list will change the API), but
the structures which they use (and, less frequently, their semantics).
Again, structures often have members added - but seldom removed or
changed. In this case, a recompile will be a simple fix. Windows APIs
often include the size of structures as part of their parameters (or as
a field in the structure itself), so that code can take into account
varying sizes for different versions of windows (newer versions add to
the end of the structures). This allows better binary compatibility, at
the cost of run-time overhead (space needs to be allocated dynamically
rather than statically).
I have never heard of changing user-level binary API interfaces being a
serious problem on Linux (it is viewed by some to be a serious problem
at the device driver level, but mainly by people who simply don't
understand Linux), but I suppose it might be for some types of software.