"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
GLIBC_2.42inlibc.so.6: glibc 2.42 made<termios.h>take arbitrary baud rates (glibc NEWS), andcfgetispeed,cfgetospeed,cfsetispeed,cfsetospeedandcfsetspeedgot new versions. Code that sets up a terminal calls them: node-pty'spty.nodeneedscfsetospeed@GLIBC_2.42(muster-code #680), and line editors such as libedit call them too.GLIBC_2.43inlibm.so.6: glibc 2.43 moved the old SVID error handling ofacosf,asinf,atan2f,log10f,sqrtf,sinhf,coshf,lgammaf,tgammaf,remainderand a few others into compatibility symbols. A program built on 2.43 that calls any of them links to the newGLIBC_2.43versions. These are common enough that bundled libraries pick them up as well (WebKitGTK and Little CMS in Decktector #3).- New functions such as
msealandopenat2are alsoGLIBC_2.43, but only code that calls them needs it for them.
Where the reports came from
- Release binaries: MicroPython and CircuitPython interpreters (pydevices #391), the mysql client in a MySQL distribution's tarballs (villagesql-server #1505), and a Rust test runner and other programs that needed
GLIBC_2.43(turbo-test #221, wisp #15, Amber-widget #8). In one Go project the binary built withCGO_ENABLED=0was fine, and the one that links llama.cpp through cgo neededGLIBC_2.43(la-roca #596). - Electron apps with node-pty: the .deb did not start on Ubuntu 24.04 (aios-app #93, devhub #67). In one project a weekly prebuild run landed on 26.04 and replaced the published node-pty prebuilds, so installs that download them broke as well (ws-scrcpy-web #989).
- Container images: a binary built on the runner and copied into
debian:trixie-slim(glibc 2.41) fails when the container starts (hyperi-ci #747).
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
- "version `GLIBC_2.4x' not found" on a user's machine: the binary was built on a newer glibc.
ldd --versionthere shows the machine's glibc, andobjdump -Ton the binary shows what it needs. - The same message on the runner: a cache or artifact from the other image.
undefined reference to `cfgetispeed@GLIBC_2.42'at link time: a toolchain with its own older glibc is linking against a library from the 26.04 system (Nix's binutils and the runner's libedit in tinygo #6125).- The other direction, a binary or cache from 24.04 on 26.04, fails with "cannot open shared object file" (libxml2 and ICU).
- Look at "Set up job" in the release run: the Runner Image group shows the image. Until November 19 a release can land on 24.04 and work, so one working release proves nothing about the next.
Other 26.04 failures
- Postgres never starts in Docker on Ubuntu 26.04: newer kernels such as 7.0.0-42 run container processes as
docker-default//&unconfined, so they cannot signal each other andgosuhangs at 100% CPU; reported on self-hosted runners so far. - rpmbuild on Ubuntu 26.04: rpm is 6.0.1, so
%installruns in a per-package build directory and Electron Forge's RPM maker fails with "cp: cannot stat 'usr/*'", and packages are v6 unless you pass_rpmformat 4. - "cannot enable executable stack" on Ubuntu 26.04: glibc 2.43 refuses to
dlopena library that asks for an executable stack, so Julia 1.10.0 to 1.10.8, conda-forge TensorFlow 2.19 and some MEX files fail with "Invalid argument". - "cannot open shared object file" on Ubuntu 26.04: libxml2 is
libxml2.so.16and ICU is 78, so a cache saved on 24.04, or a binary built for it, cannot findlibxml2.so.2orlibicudata.so.74. - C and C++ builds that fail with GCC 15 on Ubuntu 26.04: the default gcc goes from 13 to 15, so C is compiled as C23, six old warnings are errors, and C++ headers no longer pull in
<cstdint>for you. - apt on Ubuntu 26.04: renamed and removed packages.
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 · 日本語