Debian 2.0 Hamm and the Transition to Libc6

Debian 2.0, codenamed "Hamm" and released in July 1998, represents a watershed milestone in the history of the Debian operating system due to its comprehensive transition from the older Linux libc5 to the modern GNU C Library 2, packaged as libc6. This article explores why this foundational transition was necessary, the technical hurdles Debian developers overcame to recompile the distribution without breaking existing installations, and how this architectural shift established modern standards for Debian's stability and multi-architecture capabilities.

The Need to Move from libc5 to libc6

During the mid-1990s, the Linux ecosystem relied primarily on Linux libc5, an independent fork of an earlier GNU C Library release tailored specifically for the Linux kernel. While libc5 served Linux well during its early growth, it faced significant limitations:

  • Standards Compliance: It drifted away from emerging POSIX, ISO C, and Single UNIX Specification standards.
  • Architecture Limitations: It was heavily tied to the x86 architecture and lacked clean support for 64-bit processors, such as the DEC Alpha.
  • Threading and Localization: It provided limited internationalization (NLA/locales) and lacked robust threading implementations.

The Free Software Foundation resolved these issues with GNU C Library 2 (glibc 2). Because glibc 2 was a major revision, Debian packaged it under the soname libc6. However, libc6 altered application binary interfaces (ABIs), meaning dynamic binaries compiled against libc5 could not run against libc6 libraries without causing application crashes.

Engineering the Migration in Hamm

Transitioning an entire operating system to an incompatible core C library required recompiling thousands of packages and ensuring existing user systems remained bootable and functional throughout the upgrade. Debian 2.0 achieved this through several deliberate engineering steps:

  1. Parallel Library Support: To prevent installed proprietary software and un-migrated packages from breaking, Debian maintained compatibility packages. The runtime linker (ld.so) was updated to manage paths for both libc5 (/lib/libc.so.5) and libc6 (/lib/libc.so.6) simultaneously.
  2. Coordinated Recompilation: Developers had to bootstrap the compiler toolchain (gcc, binutils, and make) against libc6, then recompile packages in strict dependency order. Core utilities like dpkg, bash, and tar had to be transitioned first.
  3. Upgrade Path Solutions: Because the package manager (dpkg) itself relied on the C library, standard upgrade paths risked circular dependency failure. The development community created a standalone shell utility known as autoup.sh, which manually unpacked base libc6 packages in a fail-safe order. Debian 2.0 also marked the initial, experimental introduction of the Advanced Package Tool (apt), laying the groundwork for automated upgrades in future releases.

Lasting Impact on the Debian Ecosystem

Debian 2.0 Hamm proved that a decentralized, community-driven distribution could execute a deep architectural overhaul across an entire software archive.

The move to libc6 enabled Debian to officially support multiple hardware architectures. Hamm was the first release to officially include the Motorola 68000 (m68k) architecture alongside i386, with ports to Alpha, Sparc, and PowerPC rapidly following. By standardizing on glibc, Debian established an enterprise-grade foundation that streamlined long-term binary stability, international localization, and the modern packaging workflows still used today.