Skip to content

Document that the pinned .NET 11 preview SDK cannot run on Bionic-only hosts #1226

Open

Description

@qapdex-maker

What would you like to see in the repo docs? The pinned .NET 11 preview SDK cannot be installed on a Bionic-only host, and I could not find that written down anywhere. Raising it because I hit it hard while trying to build this repo on a phone, and the failure mode is misleading.

The constraint

global.json pins:

{ "sdk": { "version": "11.0.100-preview.3.26207.106", "rollForward": "latestMajor" } }

The official SDK tarballs and dotnet-install.sh are glibc binaries. On a host whose loader is Bionic they install cleanly and then do not run.

What I verified on an aarch64 Termux/Android host

Check Result
dotnet-install.sh --version 11.0.100-preview.3.26207.106 "Installation finished successfully"
./.dotnet/dotnet --version cannot execute: required file not found
ELF interpreter the muxer requests /lib/ld-linux-aarch64.so.1 (glibc)
glibc libc.so.6 on the device none
System loader on the device /system/bin/linker64 (Bionic)
dotnet-sdk-10.0 from the distro works — it is a Bionic build

So the install succeeds and the failure only appears on first run, which reads like a corrupt download rather than an ABI mismatch.

What does not help

  • patchelf-ing the muxer to the Bionic loader. The glibc runtime itself is absent, so there is nothing to point at.
  • rollForward in global.json. That selects SDK versions, not the ABI.
  • Installing a different SDK version. dotnet-sdk-10.0 runs and builds net10.0, but it does not satisfy this global.json, so the repo still will not build.

Environments that do work

  • GitHub Codespaces / Actions — actions/setup-dotnet@v5 with global-json-file: global.json. This is what CI uses and it is the green path.
  • Docker — mcr.microsoft.com/dotnet/sdk:11.0-preview is glibc-based and resolves the pinned preview.
  • WSL 2 — real glibc userspace, the preview runs.
  • Any glibc Linux, x64 or arm64, real or VM.

For a phone, the route that worked for me was a glibc guest under PRoot (Ubuntu 24.04, glibc 2.39), which needs three settings because PRoot blocks .NET's default virtual-address reservation:

export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1   # no libicu in a minimal rootfs
export DOTNET_GCHeapHardLimit=134217728          # 128 MiB hard GC limit
ulimit -v 8388608                                # cap virtual memory at 8 GiB

Without them the runtime aborts with GC: Reserving 274877906944 bytes ... failed / 0x8007000E.

The suggestion

Not a new docs/ file — @AbhitejJohn pointed out on #1036 that platform notes belong in the README or contributing docs. My instinct is a short subsection in CONTRIBUTING.md under development setup, because the reader who hits this is a contributor trying to build, not someone reading the README. Something like a "supported build environments" note plus the one-line fact that the pinned preview is glibc-only.

Happy to send a small PR against main for whatever shape you prefer, and I am happy to drop the PRoot detail entirely if it is too niche for a shared doc — the useful part is really just "the pinned SDK is glibc-only; use Codespaces, Docker, WSL 2 or a glibc VM".

Activity

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions