Five days ago I wrote about a year-old "not planned" Rolldown bug that made vite dev crash with Illegal instruction on every Android arm64 device running Termux. The short version: @rolldown/binding-android-arm64 was compiled assuming ARMv8.1 atomic instructions that chips like a Cortex-A53 don't have, so it died inside dlopen before a single line of JS ever ran.
That post ended on a cliffhanger — a verified preview build, an open PR, and a "we'll merge before Wednesday" from the maintainer.
It's Wednesday. It's merged.
The confirmation
On rolldown/rolldown#10638, I followed up asking @shulaoda — Jerry Zhao — for a timeline, since a lot of us on Termux/Android were blocked on this for any Vite-based project:
"@GourangaDasSamrat Hey! I'll merge this before the next release, which is scheduled for Wednesday." — @shulaoda
And that's exactly what happened. The fix — extending mimalloc's no_opt_arch cfg to cover aarch64 on Linux, Android, and FreeBSD, not just Linux — is now in main, tied to rolldown/rolldown#6342, the issue that spent ten months closed as "not planned" before a tombstone trace and a real device to test on turned it back around.
Why this one mattered more than a typical dependency bump
I want to be honest about why I'm writing a second post about one merged PR: this bug was never really about Rolldown. It was about who gets left out when tooling quietly assumes everyone's dev machine is a laptop.
A huge number of people learning to build for the web — across Bangladesh, Nigeria, Indonesia, and plenty of other places — do it on the only computer they have: a phone, through Termux. When pnpm create vite throws Illegal instruction with no readable stack trace, that's not a rough edge. It's a closed door, and the person on the other side of it usually has no way to know it's a build flag three repos upstream, not something they did wrong.
That's what made termux/termux-packages#30841 worth filing carefully, with logs for Next.js, Vite+React, and Vue. It's what made @truboxl's insistence on a real logcat tombstone — instead of terminal output — the thing that actually cracked the case open. And it's what made @robertkirkman going back to a closed upstream issue with that tombstone in hand, instead of accepting "not planned" at face value, the actual turning point.
The fix, one more time, plainly
@sapphi-red had spotted the root cause: Rolldown depends on mimalloc, and the no_opt_arch feature that stops mimalloc from assuming newer ARM instructions exist was gated on target_os = "linux" only. Android runs on a Linux kernel but reports its own target_os, so the Android build silently skipped that safety flag and got compiled for ARMv8.1 atomics — instructions a Cortex-A53 simply does not have. Since mimalloc initializes in a library constructor, that lines up exactly with a SIGILL at dlopen, before any of Rolldown's own code runs.
rolldown/rolldown#10638 widens that cfg to cover aarch64-linux-android (and FreeBSD arm64, which had been falling through every mimalloc cfg block too). One condition, fixed.
What's still open
Merged into main isn't the same as published to npm. @shulaoda tied the merge to Rolldown's next scheduled release, so npm install -g rolldown and a fresh create vite on Android arm64 will pick up the fix as soon as that version ships — no Termux-specific package, no workaround, just the default install path working the way it's supposed to.
On the Termux side, termux/termux-packages#30887 — @DevGitPit's PR to package Rolldown 1.2.3 downstream — is still open too, and still worth landing regardless, since some Termux users are on ABIs Rolldown doesn't build for at all (32-bit ARM, x86, x86_64), a gap @robertkirkman already flagged to the Rolldown team directly.
And termux/termux-packages#30852, the original "please package Rolldown" request, gets to become optional instead of necessary — which is the better outcome. A downstream patch was always going to be a thing someone had to maintain forever. An upstream fix is just a fix.
Why I'm posting this as its own thing
I could have just edited the last post. I didn't, on purpose. The lesson from ten months of "not planned" isn't "and then it got fixed" — it's that closing the loop publicly, with dates and names attached, is part of what keeps these things from rotting shut again. @shulaoda said Wednesday. It's Wednesday. That's worth saying out loud, the same way the original bug being ignored for ten months was worth saying out loud.
If you're on Termux/Android arm64 and you've been avoiding create vite because of this — you can stop avoiding it once the next Rolldown release ships. If you want to verify on your own hardware before then, the preview build in #10638 still works today.
And if you found the original writeup useful, it's here — this post is the part two I promised at the end of it.
Top comments (0)