Lesstep
GitHub Actions · Ubuntu 26.04 · Checked November 4, 2026

"version `GLIBC_2.43' not found" after building on Ubuntu 26.04

ubuntu-latest is moving from Ubuntu 24.04 to 26.04 between October 19 and November 19, 2026 (what else changes). glibc goes from 2.39 to 2.43 (Ubuntu's package list, November 4). A program built against glibc needs at least the version of the newest glibc symbols it links to, so a binary built on 26.04 can need GLIBC_2.42 or GLIBC_2.43 with no change to its source. The job is green, because the runner has glibc 2.43. The failure shows up after the release, on your users' machines: Ubuntu 24.04 has 2.39, Debian 13 has 2.41 and Ubuntu 22.04 has 2.35.

What it looks like

./app: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.42' not found (required by ./app)
./app: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.43' not found (required by ./app)

In an Electron app the message is one step removed. node-pty reports Failed to load native module: pty.node, and loading pty.node directly shows version `GLIBC_2.42' not found. An AppImage lists the bundled libraries that need the newer glibc.

Where GLIBC_2.42 and GLIBC_2.43 come from

Where the reports came from

Fix: build releases on the oldest image you support

jobs:
  build-linux:
    runs-on: ubuntu-22.04   # glibc 2.35; or ubuntu-24.04 for 2.39

A binary built against an older glibc runs on newer ones, because glibc keeps the old symbol versions. The reports above fixed it this way: ubuntu-22.04 and ubuntu-22.04-arm for turbo-test, ubuntu-24.04 for wisp and muster-code. Only the jobs that build what you ship need to move. It holds until GitHub retires that image.

Or build in an older container, or for a set glibc

jobs:
  build-linux:
    runs-on: ubuntu-latest
    container: ubuntu:22.04

The container's glibc is what the binary links to, whatever the runner image is. The image starts bare, so install your compilers with apt-get first. For Python extension wheels, the manylinux images do the same job.

For Rust, cargo-zigbuild takes a glibc version as a suffix of the target (cargo-zigbuild):

cargo zigbuild --release --target x86_64-unknown-linux-gnu.2.28

A *-musl target, or a Go build with CGO_ENABLED=0, does not depend on glibc at all.

Check the floor in CI

Whichever fix you choose, add a step that fails the job when a binary needs a newer glibc than you support, so the next image change stops the release instead of reaching users:

- name: Check the glibc floor
  run: |
    need=$(objdump -T dist/app | grep -oE 'GLIBC_[0-9]+(\.[0-9]+)+' | sed 's/GLIBC_//' | sort -uV | tail -n 1)
    echo "dist/app needs glibc $need"
    [ "$(printf '%s\n' "$need" 2.35 | sort -V | tail -n 1)" = 2.35 ]

Run it on every native file you ship, including .node add-ons inside an Electron package. To see which symbols are responsible:

objdump -T dist/app | grep -E 'GLIBC_2\.4[23]'

Starting the packaged app in a job on the oldest image catches the rest. In muster-code, a smoke job on ubuntu-24.04 is what caught it.

The same message inside CI: a cache from the other image

A cache that holds built executables or shared libraries carries the glibc of the image that saved it. In one project, a job on ubuntu-latest saved its Cabal store under the same key as the ubuntu-22.04 jobs, which then restored it and failed with GLIBC_2.42 not found (required by .../libHSunix-....so) (wasp #5221). Until November 19, ubuntu-latest jobs land on either image, so the same key can be saved by one and restored by the other. Put the glibc version in the key:

- id: glibc
  run: echo "version=$(getconf GNU_LIBC_VERSION | cut -d' ' -f2)" >> "$GITHUB_OUTPUT"
- uses: actions/cache@v4
  with:
    path: ~/.cabal/store
    key: cabal-${{ runner.os }}-glibc-${{ steps.glibc.outputs.version }}-${{ hashFiles('**/*.cabal') }}

Telling it apart

Other 26.04 failures

See failed jobs from IntelliJ IDEA

Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).

Get it on JetBrains Marketplace

GitHub and GitHub Actions are trademarks of GitHub, Inc.; Ubuntu is a trademark of Canonical Ltd.; Debian is a registered trademark of Software in the Public Interest, Inc.; Electron is a trademark of the OpenJS Foundation; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc., Canonical, Software in the Public Interest, the OpenJS Foundation, the GNU C Library project or JetBrains.

More: "The ubuntu-latest label will migrate to Ubuntu 26" · "cannot open shared object file" on Ubuntu 26.04 · GitHub Actions plugins for IntelliJ IDEA compared · 日本語