Every Electron AppImage hung without a window or crashed at its first page.
Four causes, each enough on its own:
- The session preload's hooks found the real functions with
dlsym(RTLD_NEXT). Before glibc 2.34 a thread's first dlsym callocs, and
Chromium's PartitionAlloc calls syscall() from inside its first malloc:
the allocator waited for itself. On older glibc (the x86 runtime's 2.31)
next.c now walks the libraries after the preload with no allocation and
picks each function's default version, as glibc 2.36 does; the old
lookup handed realpath() and posix_spawn() their compat versions, and
realpath(path, NULL) failed. arm64 keeps dlsym.
- libpci's sysfs backend exits when /sys/bus/pci/devices is listable but a
device's files are not (a RedMagic's PCIe root port), taking every
Chromium GPU process with it. An empty directory is bound over it on
devices where that happens.
- FEX_OUTPUTLOG=stderr made FEX log to its own duplicate of descriptor 2.
Chromium dup2()s its IPC socket onto that low number in each child it
starts, then lists /proc/self/fd, which FEX logs into the socket. Empty,
FEX writes to descriptor 2 itself.
- The tracer preload served every /proc/<pid>/status as a memfd, which is
open for writing. Chromium hands each renderer its status as a read-only
file and checks that it is one. Only a process's own status (pid, tid,
self, thread-self) is rewritten now.
* Run programs, scripts and AppImages from the desktop
Windows programs open with the Proton Steam has chosen, and a Steam game's own
launch program is handed to Steam. x86-64 Linux programs and game scripts run
under FEX, and an exec the kernel refuses goes to droiddeck-open through
libblsession's binfmt.c. Programs on noexec shared storage pass KIO's checks; a
folder of Linux programs there, and sharun AppImages, are added by the app once
and run from the copy. Executable scripts run without KIO's prompt, mpv plays
on the software desktop, FEXServer's socket moves under XDG_RUNTIME_DIR, and
Proton runtimes no longer show up as games.
* Switch to Desktop from Big Picture without Deck mode
Big Picture's Switch to Desktop asks the client's SteamOS manager, which the
client only has when started as SteamOS (Deck mode). Without it the request
failed and the screen stayed on "Switching to Desktop..." for good. The live
compat helper now sees the request on its way to the client and hands it to
steamos-session-select, which opens the KDE desktop as Deck mode already did.
* Run x86 programs from shared storage where they lie
FEX asks for the guest's PROT_EXEC when it maps a program or library, which
the kernel refuses on noexec shared storage; FEX never runs those pages
itself, so libblsession maps them without it in FEX's processes. An x86
game, its libraries and its start script now run in place instead of being
copied in; only native code on noexec storage is still copied.
A Steam library's games are never copied, and a Linux game's launch program
opened from the desktop goes to Steam like a Windows one.