As a point of comparison, OpenBSD is one of the last operating systems to do things extremely old school, by versioning the library filename and not the internal library symbols.
To repeat the experiment here, one might run ldd /usr/bin/top (tar is static) and see:
So we know it requires version 87 of libc. (This does not reliably map to any one OpenBSD version.) You know you have version 87 of libc by running ls in /usr/lib. i clearly have quite a few versions.
There is generally no provision for “back compiling”. Compiled programs always link against the newest version of the library, and will require that and only that version at runtime.
Similarly programs linked against older versions will only run if the old library is actually present. Functions may have been removed, so it’s not safe to use a new version.
(Technical detail: symbols are only removed in “major” version (the first number), but can be added in a “minor” version (the mostly 0 second number). The dynamic linker will use a library with a greater minor if it can’t find an exact match, but never a smaller one.)
Some people really like long term binary compatibility. OpenBSD mostly limits itself to compatibility for long enough to update conveniently. You think you want to run that 20 year program last compiled in 1998, but do you? Really?
As a point of comparison, OpenBSD is one of the last operating systems to do things extremely old school, by versioning the library filename and not the internal library symbols.
To repeat the experiment here, one might run
ldd /usr/bin/top(tar is static) and see:So we know it requires version 87 of libc. (This does not reliably map to any one OpenBSD version.) You know you have version 87 of libc by running ls in /usr/lib. i clearly have quite a few versions.
There is generally no provision for “back compiling”. Compiled programs always link against the newest version of the library, and will require that and only that version at runtime.
Similarly programs linked against older versions will only run if the old library is actually present. Functions may have been removed, so it’s not safe to use a new version.
(Technical detail: symbols are only removed in “major” version (the first number), but can be added in a “minor” version (the mostly 0 second number). The dynamic linker will use a library with a greater minor if it can’t find an exact match, but never a smaller one.)
That method seems a bit…brutish. That said, why would anyone do anything different?
It looks simple and hard to inadvertantly fuckup–kind of like packaging lots of versions of the MSVC/DirectX runtime with games. :)
One answer I got from a debian developer once was: “When a core library is updated, you’d have to recompile all of debian.”
Some people really like long term binary compatibility. OpenBSD mostly limits itself to compatibility for long enough to update conveniently. You think you want to run that 20 year program last compiled in 1998, but do you? Really?