Found while fixing linux-in-the-browser#77 (make exit 2 = the musl posix_spawn gap, fixed libc-side). Rebuilding GNU make 4.4.1 on the current F162 drop (4278a49) produces a binary that traps before doing ANY work — even make --version — so the #77 image remedy (rebuild make against the fixed musl) is blocked on this.
Witness (identical across every build variant)
hwjs-user-rt VIOLATION: set-over-set: parked slot not empty at a new park
(orphaned handle 0x005420d0 owner-word=0x00000017 id-via-frame-header[h+4]=0x0000009a;
incoming handle 0x00542210 owner-word=0x0000001f)
— a coroutinized frame parked under a NATIVE caller and the witness reached the next park
Trap stack (O2 build, from onUserError):
make.free (wasm-function[159])
make.variable_expand_string (wasm-function[330])
make.variable_expand.resume (wasm-function[266])
make.hwjs_resume / hwjs_drive_loop / _start
The host reaps it as a SIGILL death ($? = 132, tty stays live — the #83 reap belt works), but make is unusable.
Build recipe
CC=toolchains/hwjs-cc/bin/wasmcc
CFLAGS='-O2 -include alloca.h -D_GNU_SOURCE'
configure --host=wasm32-hwjs-linux-musl --build=x86_64-pc-linux-gnu \
--disable-nls --disable-dependency-tracking
env: WASMLD_HWJS=1 WASMLD_ASYNCIFY=0, sysroot = distros/common/build/musl-1.2.5-build
(one generated-Makefile fixup: strip the polluted "typedef unsigned int size_t; void *alloca(size_t);"
prefix from lib/Makefile GL_CFLAG_GNULIB_WARNINGS — same as the findutils #83 build)
Ruled out (all variants trap IDENTICALLY, same handles/owner-words)
- -O2 vs -O1: both trap → not the memory-effect-lie fold class (F160 strip is on).
- --disable-load --without-guile (drops
-Wl,--export-dynamic+ dlopen machinery): still traps. - musl pre/post the #77 posix_spawn/pclose overlays: both trap → not interaction with the new libc suspenders.
- -O0: does not link — the pass REFUSES
glob/f_mtime/ar_globwithvla/dynamic-alloca-address-escape-opaque-sink(loud, correct never-silent). At O1/O2 those shapes are DS-LOWERED instead and the link succeeds — so a believed-sound lowering (or a distinct orphan source) is producing a chain whose caller is native at runtime. - Not a #77 regression: the kent/brintos-dev image's make (older drop, 1.7 MB) runs
--versionand parses Makefiles fine (it only failed at posix_spawn, now fixed in musl).
Note src/expand.c uses dynamic alloca in exactly the trapping neighborhood (variable_expand_string / patsubst paths), and make is a heavy qsort_r/function-pointer consumer — both active axes (the #73 gqsort/VLA work).
Repro artifacts
make --versionalone reproduces (no Makefile needed) under the musl rig or the brintos-dev rootfs headless harness.- Build dirs + logs preserved in the #77 session scratchpad (
make-build{,2,4,5}, drain/dmesg logs); the O2 binary is 1.63 MB.
Blocking: linux-in-the-browser#77 end-to-end (make -f /tmp/mk printing MK_OK on a current-toolchain make). The libc half of #77 is landed and gate-proven (run-posix-spawn-gate.mjs); this is the remaining half.