Skip to content

docs: state the real glibc floor of the s390x jar; follow-ups in TODO - #568

Merged
bernardladenthin merged 1 commit into
mainfrom
docs/s390x-glibc-floor
Oct 25, 2026
Merged

bernardladenthin merged 1 commit into
mainfrom
docs/s390x-glibc-floor

Conversation

@bernardladenthin

@bernardladenthin bernardladenthin commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

Documentation only; the build and the shipped artifacts do not change.

What was wrong

  • README: the row for cpu-linux-s390x said only "A JDK 8+ JVM".
  • CHANGELOG ("Upgrading from 5.1", item 5): it promised glibc 2.28 for all of Linux.

What the CI artifacts actually require

Measured on the artifacts of Publish runs 40217818548 and 40227501358:

jar GLIBC GLIBCXX built with
cpu-linux-x86-64 2.27 3.4.25 GCC 14.2.1, manylinux_2_28
cpu-linux-aarch64 2.27 3.4.25 GCC 14.2.1, manylinux_2_28
cpu-linux-s390x 2.38 3.4.32 GCC 13.3.0, Ubuntu 24.04 cross toolchain

Load test

The test loads the way a consumer does: llama and cpu-linux-s390x from llama-jars on the classpath, then LlamaLoader.initialize(). It ran in Docker, with s390x emulated by qemu.

  • Fails on RHEL 8.10 with UnsatisfiedLinkError … GLIBC_2.38 not found. libstdc++ is missing GLIBCXX_3.4.26–3.4.32 there as well.
  • Fails on RHEL 9 and Ubuntu 22.04.
  • Loads on Ubuntu 24.04.
  • ldd finds no missing versions on SLES 15 SP6, Debian 13 and Ubuntu 25.04.
  • Controls: the x86-64 and aarch64 jars load on RHEL 8.

Why it is a side effect, not a decision

  • GLIBC_CEILING lists only the manylinux directories. Every other Linux build "inherits the floor of the ubuntu runner", and CLAUDE.md justifies that for GPU modules only.
  • The s390x CI test cannot see the gap: its ctest runs under qemu against the same glibc 2.39 sysroot the build used.

Changes

  • README: the s390x row now states the floor: glibc ≥ 2.38 and the libstdc++ of GCC 13; not RHEL 8/9 or Ubuntu 22.04.
  • CHANGELOG: item 5 limits the 2.28 floor to x86-64 and aarch64 and names s390x as the exception.
  • TODO: a new section, "Linux s390x: glibc 2.38 floor (after the release)", with the measurements and three follow-ups:
    • pin the runner to ubuntu-24.04;
    • add "Linux/s390x/cpu": (2, 38) to GLIBC_CEILING;
    • make the real fix: a 2.28 floor through manylinux_2_28_s390x or a glibc 2.28 sysroot, with the gcc-toolset treatment for libstdc++ and acceptance on cfarm191/192.

check-natives.py reports 0 disagreements.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AJGh28Gu8pLWYbTCqG1LZf

Summary by CodeRabbit

  • Documentation
    • Clarified that Linux s390x CPU support requires glibc 2.38 or newer and a compatible C++ runtime. Ubuntu 24.04, SLES 15 SP6, and Debian 13 are listed as examples.
    • Noted that RHEL 8/9 and Ubuntu 22.04 do not meet these requirements, while the glibc 2.28 minimum for other Linux CPU packages remains unchanged.

README said only "A JDK 8+ JVM" for cpu-linux-s390x, and CHANGELOG item 5 promised glibc 2.28 for
all of Linux. Both were wrong for s390x. The jar references GLIBC_2.38 and GLIBCXX_3.4.32, because
it is cross-compiled on ubuntu-latest (GCC 13.3, glibc 2.39 sysroot) instead of in a manylinux
image. The x86-64 and aarch64 jars stay at 2.27 / 3.4.25.

Measured 2026-10-25 on the CI artifacts of Publish runs 40217818548 and 40227501358, loading as a
consumer does (llama + cpu-linux-s390x on the classpath, LlamaLoader.initialize(), s390x emulated
by qemu in Docker):
- fails on RHEL 8.10 (GLIBC_2.38 not found, libstdc++ too), RHEL 9 and Ubuntu 22.04;
- loads on Ubuntu 24.04;
- ldd is clean on SLES 15 SP6, Debian 13 and Ubuntu 25.04;
- the x86-64 and aarch64 jars load on RHEL 8.

No build change before the release. TODO.md records the follow-ups:
- pin the runner to ubuntu-24.04;
- add a GLIBC_CEILING entry at (2, 38);
- reach the 2.28 floor through manylinux_2_28_s390x or a glibc 2.28 sysroot.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AJGh28Gu8pLWYbTCqG1LZf
@coderabbitai

coderabbitai Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

Walkthrough

The README and changelog now state distinct runtime requirements for Linux s390x and other Linux CPU platforms. The TODO records distribution compatibility results and build follow-ups for the s390x CPU jar.

Changes: Linux s390x Runtime Requirements

Layer / File(s) Summary
Document s390x compatibility requirements
README.md, CHANGELOG.md, TODO.md
The README and changelog distinguish the Linux s390x runtime requirements from other Linux CPU platforms. The TODO records tested distributions, observed load failures, and build follow-ups.

Estimated code review effort: 2 (Simple) | ~8 minutes

Change: Other

Suggested reviewers: claude

Merge Risk: Low · up to 69d81

Clarify the SLES and Debian wording before merging so users do not mistake dependency checks for confirmed runtime support.

Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@sonarqubecloud

Copy link
Copy Markdown

@bernardladenthin
bernardladenthin merged commit d5ffd48 into main Oct 25, 2026
11 of 18 checks passed
@bernardladenthin
bernardladenthin deleted the docs/s390x-glibc-floor branch October 25, 2026 20:52

This branch had an error being deployed

1 failed deployment
maven-central — 69d81312 Deployed Oct 25, 2026 by bernardladenthin via Verify GPG signing key (no secrets printed) #1363
startgate — 69d81312 Deployed Oct 25, 2026 by bernardladenthin via Start gate (abort window) #1363
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant