v2.8.19
Three stacked bugs that prevented .krbo fat binaries from running in Termux on Android 14+, plus four signed-arithmetic / mixed-float codegen-correctness fixes.
Termux runner
runner.krargv-shift detection now matchesargv[0] == argv[1](Termux's exec wrapper duplicates the binary path), sokr --versionno longer parses--versionas a.krbopath and SIGBUS on garbage.- New
kr-runnerMake target that concatenatesrunner.kr+bcj.kr. Building the runner alone leftfilter_aarch64_bcj/filter_x86_64_bcjunresolved and silently corrupted every extracted slice (entry-point bytes clobbered → SIGBUS at startup). packaging/kr.shshell wrapper that catches the runner's exit-120 and re-execs./kr-execfrom the user's shell context. Rawexecvefrom the runner's app SELinux domain hitsEACCESbecause Termux wrapsexecvevia libcLD_PRELOADand oursvc 0syscall bypasses it; the user's shell context has the wrapper engaged so the re-exec succeeds.
Compiler correctness
- Mixed f32/f64 in
BinOp+Assign— widen the narrower side to f64 in float arithmetic.a + 1.0forf32 ano longer silently reads zero (low 32 bits of f641.0). - Signed-aware compare —
int64 var < 0now actually fires. Added a parallelir_vreg_signed_bufbyte array;int8/16/32/64declarations tag it, BinOp/Assign propagate, ordering compares pickIR_SCMP_*over unsignedIR_CMP_*.uint*stays unsigned. - Signed
/,%,>>— newIR_SDIV(132),IR_SMOD(133),IR_SAR(134) emitcqo + idiv/asron x86 and aarch64. Mirrored in the legacy backend with AST-derived signedness (legacy_node_is_signed).
Verified on Z Fold 5 / Android 16 / Termux: kr program.krbo runs and exits 0. Bootstrap fixed point at 1,240,432 bytes; 439/439 tests pass.
Full Changelog: v2.8.18...v2.8.19
Full Changelog: v2.8.18...v2.8.19