Symptom
_coverage_check_c_runtime measures effects_coro.c at 92.78% on Linux and materially higher on macOS. The gate threshold is therefore pinned at 91 (raised from main's 88) rather than the 95 the macOS numbers suggested.
Cause
compiler/runtime/test_death.h flushes coverage from the forked child with:
dlsym(RTLD_DEFAULT, "__gcov_dump")
On Mach-O this resolves. Under GNU ld it returns NULL unless the executable is linked with -rdynamic / -Wl,--export-dynamic, so every death test's coverage is silently discarded on Linux. The lines those tests exercise show as uncovered even though the assertions ran and passed.
Fix
Add -rdynamic (or -Wl,--export-dynamic) to the gcov-instrumented link in the Makefile, confirm dlsym resolves in a Debian container, then ratchet effects_coro back toward 95 once the Linux measurement supports it.
Verification
Reproduce in a container:
docker run --rm -v "$PWD":/w -w /w debian:bookworm bash -c '...gcc --coverage ... && gcov ...'
Compare effects_coro.c.gcov with and without -rdynamic.
Related: #197.
Symptom
_coverage_check_c_runtimemeasureseffects_coro.cat 92.78% on Linux and materially higher on macOS. The gate threshold is therefore pinned at 91 (raised from main's 88) rather than the 95 the macOS numbers suggested.Cause
compiler/runtime/test_death.hflushes coverage from the forked child with:On Mach-O this resolves. Under GNU ld it returns
NULLunless the executable is linked with-rdynamic/-Wl,--export-dynamic, so every death test's coverage is silently discarded on Linux. The lines those tests exercise show as uncovered even though the assertions ran and passed.Fix
Add
-rdynamic(or-Wl,--export-dynamic) to the gcov-instrumented link in the Makefile, confirmdlsymresolves in a Debian container, then ratcheteffects_coroback toward 95 once the Linux measurement supports it.Verification
Reproduce in a container:
Compare
effects_coro.c.gcovwith and without-rdynamic.Related: #197.