Skip to content

deb declares no libc dependency: installs cleanly on older distros, then every binary fails #174

Description

@ebursztein

Defect

Capsem_0.6.0_arm64.deb declares:

Depends: libwebkit2gtk-4.1-0, libgtk-3-0, libxdo3

There is no libc6 dependency, but the shipped binaries require glibc >= 2.39.

Reproduced by hand:

$ docker run --rm -v "$PWD:/src" debian:bookworm-slim bash -c \
    "dpkg-deb --extract /src/dist/Capsem_0.6.0_arm64.deb /tmp/pre && /tmp/pre/usr/bin/capsem-admin --version"
/tmp/pre/usr/bin/capsem-admin: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.39' not found

Impact

On Debian bookworm (glibc 2.36), Ubuntu 22.04 (2.35), and anything older, apt install succeeds — every declared dependency is satisfiable — and then every binary fails at runtime. The user gets a package that installed cleanly and does nothing, instead of a clear "unsatisfiable dependency" refusal at install time.

Why CI does not catch it

The install gate builds and installs on ubuntu:24.04 (docker/Dockerfile.host-builder), which ships glibc 2.39. Every supported-distro claim below that is untested. This fails on a user's machine, never in the gate.

Fix directions

  1. Derive Depends instead of hand-writing them. dpkg-shlibdeps generates the correct libc6 (>= X) and library floors from the actual binaries. The current hand-written list captures the GUI libs and silently omits libc — exactly the class of omission automation prevents.
  2. Decide and state the supported floor. If Debian stable / Ubuntu LTS are supported targets, the release binaries must be built against an older glibc (or statically/musl-linked for the CLI cohort). If they are not supported, the packaging should refuse to install there rather than install and break.
  3. Test install on the oldest supported distro, not only on the build image. A matrix entry that installs the exact .deb on the declared floor would have caught this.

Pointers

  • scripts/repack-deb.sh — where Depends is set
  • docker/Dockerfile.host-builderFROM ubuntu:24.04, the only distro the install proof ever sees
  • justfile _gate-install — the install proof

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions