Skip to content

fix(release): build the Linux x64 Node addon against glibc 2.17 #1670

Closed

Description

@DecisionNerd

Problem

The Linux x64 Node addon (@curatelabs/graphforge-linux-x64-gnu) needs glibc 2.39, so it fails to load on older glibc distributions: Ubuntu 22.04 (2.35), Debian 12 (2.36), RHEL 9 (2.34) and Amazon Linux 2023 (2.34). Nothing declares the requirement. The package's napi metadata says only libc: glibc.

The other Linux artifacts already target glibc 2.17:

Artifact Built by Highest glibc symbol
Linux x64 Python wheel (manylinux_2_17) maturin in the manylinux2014 container (#1645) 2.16
Linux aarch64 Node addon napi build with the napi cross toolchain 2.17
Linux x64 Node addon napi build --target x86_64-unknown-linux-gnu natively on blacksmith-4vcpu-ubuntu-2404 (glibc 2.39) 2.39

The Bazel-built addon had the same 2.39 floor, so this is not a regression from #1645. It was measured on the Binding RC run 36658527263 artifact graphforge.linux-x64-gnu.node with objdump -T | grep -oE 'GLIBC_[0-9.]+' | sort -Vu | tail -1.

Scope

  1. Build the Linux x64 addon against glibc 2.17, the same floor as the wheel and the aarch64 addon. Use the napi cross toolchain (--use-napi-cross), zig, or a manylinux2014 container, and keep running the lane's native execution contract on the built addon.
  2. Add a fail-closed Binding RC step that reads the addon's highest GLIBC_ symbol and refuses anything above the declared floor, as the wheel tag step does for Python.

Acceptance criteria

  • A Binding RC run on main produces a Linux x64 addon whose highest glibc symbol is at most 2.17, and the lane's native smoke, parity and async-error tests pass on that addon.
  • The new floor check fails a deliberately mutated build (for example, a native host build), shown by a policy test or a mutation run.

Activity

  1. added
    bugSomething isn't working
    ci-cdCI/CD configuration changes
    on Sep 30, 2026
  2. DecisionNerd commented on Sep 30, 2026

    @DecisionNerd
    ContributorAuthor

    Closed by hand. GitHub is not auto-closing from Closes #N right now. #1678 landed as 97fe6d825 on main, and both of its files are identical to the reviewed head c6b2353e5.

    Criterion 1: Binding RC on main. Run 36725552120 on 97fe6d82 concluded success, with no failed or cancelled jobs.

    Addon (from the run's artifacts) Highest glibc symbol (readelf --dyn-syms) Floor step log
    graphforge.linux-x64-gnu.node GLIBC_2.16 (was 2.39) glibc_required=2.16 floor=2.17
    graphforge.linux-arm64-gnu.node GLIBC_2.17 glibc_required=2.17 floor=2.17
    • The downloaded x64 addon's version() returns 0.5.2.
    • The x64 lane built on Node 22 (node-version: 22) for the napi cross toolchain, then ran "Execute the addon on the Node engines floor" (node: v20.20.0).
    • On Node 20 the native contract passed: smoke # pass 8 / # fail 0, and parity + async-errors # pass 7 / # fail 0.

    Criterion 2: the floor check fails a mutated build.

    • Run verbatim against the previous native-built x64 addon (run 36658527263), the step printed "needs glibc 2.39, above the declared floor 2.17" and exited 1.
    • scripts/ci/test-binding-release-candidate.py refuses each of these mutations:
      • removing the x64 glibc_floor, runtime_node_version or Node 22 build pin;
      • prefixing the check with true ||;
      • removing set -euo pipefail.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingci-cdCI/CD configuration changes

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions