Skip to content

fix(compile): bump libsui to 0.16.1 to survive eu-strip in flatpak - #35699

Merged
littledivy merged 3 commits into
denoland:mainfrom
littledivy:fix/compile-eu-strip-segfault
Jul 2, 2026
Merged

fix(compile): bump libsui to 0.16.1 to survive eu-strip in flatpak#35699
littledivy merged 3 commits into
denoland:mainfrom
littledivy:fix/compile-eu-strip-segfault

Conversation

@littledivy

Copy link
Copy Markdown
Member

Fixes #35633

Problem

Standalone binaries produced by deno compile segfault (exit 139) after eu-strip runs over them — which flatpak-builder does automatically during a flatpak build. Regression in Deno 2.9, bisected to the libsui 0.16.0 bump (#35467).

Root cause

libsui's in-place Elf::append (new in 0.16.0) relocates the program header table past the original EOF, into the file gap just before the appended note. eu-strip (elfutils, as run by flatpak-builder) lays the stripped output out itself with ELF_F_LAYOUT and zero-fills every file gap that falls between two allocated sections. With only a note-sized .note.sui section past that gap, eu-strip treats the relocated program header table as dead space and zeroes it → all-NULL program headers → segfault on exec.

Fix

libsui 0.16.1 (denoland/sui#75) covers the relocated program header table with a dedicated allocated .sui.phdrs section so section-based strip tools preserve it. This bumps the dependency and adds a spec test that eu-strips a compiled binary and asserts it still runs (skips gracefully where eu-strip isn't installed).

Verification

Reproduced and fixed against the exact flatpak toolchain (elfutils 0.193, built from source) on Linux x86_64:

  • real deno 2.9.0 compiled binary + eu-strip 0.193 (flatpak flags) → segfault 139; with 0.16.1 → runs
  • every binary shape (PIE+RELR, plain PIE, non-PIE, large .bss, section-header-stripped, fully stripped) × eu-strip 0.193 & 0.190 → runs, program headers intact
  • payload sizes 1 B – 1 MB → payload still recoverable after strip
  • real denort 2.9.0 base → program headers intact after strip
  • binutils strip note-survival preserved (unchanged from 0.16.0)

Standalone binaries produced by `deno compile` segfaulted (exit 139) after
`eu-strip` ran over them — which flatpak-builder does automatically during a
flatpak build. libsui's in-place `Elf::append` (new in 0.16.0) relocates the
program header table into a file gap before the appended note; eu-strip lays
the stripped output out itself and zero-fills that gap unless an allocated
section covers it, leaving an all-zero program header table.

libsui 0.16.1 covers the relocated program header table with a dedicated
allocated section so eu-strip preserves it. Adds a spec test that eu-strips a
compiled binary and asserts it still runs.

Fixes denoland#35633
@littledivy
littledivy merged commit 3cfcdcc into denoland:main Jul 2, 2026
136 checks passed
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.

Regression: deno 2.9 compiled binary segfaults in flatpak

1 participant