| File: versions.txt | |
|---|---|
| base-0 | patch-1 |
| Line 1 | Line 1 |
| Version Skew, Version Lock, and The Reason For HEAD and STABLE | ABI Compatibility or Why We Have STABLE And HEAD |
| GNU libc has recently had a major change in the way symbols are | GNU libc has recently had a major change in the way symbols are |
| exposed to programs. There are numerous sources where you can learn the details of what's changed, but for purposes of this rant, this is all you need to know: * The dynamic linker from GNU libc 2.2.x cannot load libc.so from GNU libc 2.3.x * The dynamic linker from GNU libc 2.3.x cannot load libc.so from GNU libc 2.2.x GNU libc 2.2.x vs. 2.3.x is the only pair of library version we've encountered that causes trouble, but the problem is a general one. We refer to this sort of mismatch as *version skew*. If the version skew between your build host and the libraries you are building is too much, then your build /will/ fail. As a result, the LNX-BBC source tree has to build a version of GNU libc which matches the version installed on the build host. This is *version lock*, and there is no known workaround. Many systems still use GNU libc 2.2.x, including gargoyle.lnx-bbc.org, which is where our nightly builds take place. However, a growing number of platforms have switched to GNU libc 2.3.x, including Debian testing, which many of the LNX-BBC developers use. Because of this, the LNX-BBC source was branched on March 29th. CVS checkouts from HEAD will build an LNX-BBC which uses libc 2.3.1, which means that HEAD can only be built on systems running libc 2.3.x. The new branch, STABLE, will build an LNX-BBC with libc 2.2.5 on systems running libc 2.2.x. To complicate matters, recent versions of GNU libc and GCC have a codependent relationship. GCC 2.95.x cannot build GNU libc 2.3.x, and GCC 3.2.x cannot build GNU libc 2.2.x. HEAD and STABLE therefore also build different versions of GCC. If you are trying to build from HEAD on a system with GNU libc 2.2.x, stop. If you are trying to build from STABLE on a system with GNU libc 2.3.x, stop. Fixing this is a long-term goal. *long-term*. I can't stress this fact enough... ----8<---- _ ___ _ _ ____ _____ _____ ____ __ __ | | / _ \| \ | |/ ___| |_ _| ____| _ \| \/ | | | | | | | \| | | _ _____| | | _| | |_) | |\/| | | |__| |_| | |\ | |_| |_____| | | |___| _ <| | | | |_____\___/|_| \_|\____| |_| |_____|_| \_\_| |_| ----8<---- If you want to attempt to solve the version skew problem, understand that you are undertaking a task which pushes the limits of operating systems research. If you try it at all, do it in an office... at university... with grant money in your pocket. Do not try this at home. | exposed to programs. Version 2.2 of glibc was the last one which used unversioned symbols. The new glibc, version 2.3, uses versioned symbols. As a result, glibc 2.2's dynamic linker is unable to load glibc 2.3's libc and vice versa. The LNX-BBC build system as it existed in March 2003 (and is still the case today in the STABLE branch) relied on the dynamic linker in /lib to perform symbol resolution for all shared libraries as binaries were built. This meant that we could not expect our build system, gargoyle.lnx-bbc.org, to build glibc 2.3 and then successfully link binaries against it. We created the STABLE branch at that time which retains the older version of glibc (and also gcc, for similar reasons). This has freed us to try out whatever changes might eventually solve the problem in the HEAD branch. The solution we have settled on is to cross-compile the entire LNX-BBC, allowing us to treat the LNX-BBC ISO as an embedded system. Using this cross-compilation scheme, we have been able to build and link *some* binaries against glibc 2.3 on systems using glibc 2.2. However, many other packages use faulty mechanisms to determine whether or not they are being cross-compiled, or simply don't support cross-compilation, and so it will probably be a while before we can resolve this issue. Until then, be aware that if you are attempting to build an LNX-BBC ISO on a system which uses glibc 2.2.x, a cvs checkout from the HEAD branch will *definitely not work*. A checkout from STABLE may or may not work, but we can as least provide reasonable suggestions that might make it work. If you are building on a system running glibc 2.3.x, please use the HEAD branch but be aware that certain packages are currently failing, and you will not get an ISO. |