To be a little pedantic, things like X and gui toolkits are not part of
Linux
To be a little more pedantic, no library is part of "Linux", which is the
kernel.
- 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).
No, I quite definitely meant ABI. That's what determines whether a given
binary will run on a particular system; the API determines whether you can
compile your own binary from source.
But more generally, the situation is fairly similar with these sorts of
libraries - they get extended, but there are not often major
incompatible changes.
Changes don't have to be major; a single missing or renamed symbol is
enough to cause a binary to fail to run. Changing a function to a macro
will do it; with C++, changing the type of a function parameter will do it
(due to mangling to deal with overloading).
What changes is often catered by the standard
"./configure" process, and when necessary Linux installations have
copies of the various versions of the libraries.
Yes, but I was talking about the ABI.
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.
That was essentially what I meant by:
But binary compatibility is much more important for Windows (and Mac)
than for Linux.
and:
Lack of a stable ABI is a simple fact of life on Linux.
With Linux, it would be feasible to change low-level details such as
calling conventions or the executable format in order to facilitate
new security mechanisms. OSes where proprietary software dominates don't
have the same freedom.
Again, structures often have members added - but seldom removed or
changed.
Adding members will result in binary incompatibility if the executable is
responsible for allocation (e.g. if the structure is a local or
global variable which is filled in by a library function). A library which
is expecting an "enlarged" structure will overrun the earlier, smaller
version.
Even if the library performs allocation, you can only add to the end of
the structure. This is a problem for object-oriented libraries (e.g. GUI
toolkits), where it's common to implement subclasses by appending fields
to the parent structure (both GTK+ and Xt work this way), as you can't add
fields to any class which has a subclass without breaking binary
compatibility.