Termux 0.119.0 Fixes PRoot exec format error on Android 15 QPR2
Dated: March 22, 2026 — termux/termux-app 0.119.0
Overview:
A recent Termux release ships a patched proot package that resolves the “exec format error” crash hitting Android 15 devices that have taken the latest QPR update. If you run proot-distro on a Pixel that took the update, update Termux from F-Droid, run pkg install --reinstall proot proot-distro, and your Ubuntu, Debian, or Alpine rootfs will boot again.
Why PRoot broke on the updated platform
Android has been moving toward 16 KB page sizes on newer device kernels, and recent platform updates have begun enforcing 16 KB page alignment for newly loaded ELF binaries on supported hardware. PRoot’s ptrace-based syscall interception tripped over the stricter mapping requirement. The proot binary shipped in older Termux builds was linked against 4 KB page assumptions and failed its first execve() of any guest rootfs binary with the kernel message exec format error.
In concrete terms, running proot-distro login debian after the update returned exit code 126 immediately and printed a line like proot error: execve("/bin/bash", ...) failed: Exec format error before the shell prompt could appear. The failure is not a corrupt rootfs and not a missing binary — file /bin/bash inside the tarball still reports a valid aarch64 ELF. The kernel rejects the mapping because the executable’s PT_LOAD segments are aligned to 0x1000 (4 KB) while the running kernel requires 0x4000 (16 KB) alignment for code pages on the Page Size Agnostic userspace path.
See also recent security patch regressions.

The topic diagram above traces the failure through the stack: the updated kernel invokes load_elf_binary(), walks the program headers, and aborts at elf_map() when p_align is less than PAGE_SIZE. The diagram highlights the three places the fix had to land — the proot binary itself, the seccomp bypass helper libtalloc, and the termux-exec LD_PRELOAD hook at $PREFIX/lib/libtermux-exec.so that rewrites guest #! shebang lines. Miss any one of those and the boot of the rootfs still fails, just at a later stage — usually with sh: /bin/sh: not found once the first ELF loads but the shebang rewrite misses.
What the updated Termux release actually changes
The release rebuilds the bundled proot package against a current upstream tag, rebuilds every binary in termux-tools with 16 KB-aligned linker flags (-Wl,-z,max-page-size=16384, documented in the Android 16 KB page size guide), and adjusts termux-exec to cope with the new seccomp defaults affecting calls across the Termux-to-guest boundary.
Three commits on termux/termux-packages carry the substance of the fix. The first updates packages/proot/build.sh to point at a current upstream tag and adds a configure argument along the lines of TERMUX_PKG_EXTRA_CONFIGURE_ARGS="--with-page-size=16384". The second patches packages/termux-exec/src/exec.c so that the exec hook re-checks getauxval(AT_PAGESZ) at runtime rather than trusting the compile-time constant. The third rebuilds the Alpine, Arch, and Void rootfs tarballs distributed by proot-distro with a matching alignment so guest binaries themselves also satisfy the kernel’s stricter check.
There is a longer treatment in userspace compatibility breakage.
The relevant line in the release changelog describes it as fixing the exec format error on Android devices that enforce 16 KB page alignment. The linked user reports cover Pixel 8 Pro, Pixel 9, and Pixel Fold owners who all hit the same failure shortly after the platform update landed on their devices.

The radar chart ranks the fix across five axes drawn from the changelog: PRoot launch success (now working on affected devices, up from fully broken), startup latency (unchanged at roughly 180 ms cold-launch), memory overhead (up roughly 1.1 MB because 16 KB pages round up smaller allocations more aggressively), seccomp compatibility (improved because of the new fallback path for cross-boundary reads), and compatibility with community rootfs tarballs (slightly lower, because any custom tarball built before the fix with an older NDK still needs a rebuild to satisfy the alignment rule). A reader triaging whether to update should note the memory axis is the only regression, and 1.1 MB per rootfs is negligible against the launch-success recovery. The latency axis is worth a second look: the chart shows no visible change, which is consistent with upstream PRoot not touching its hot-path syscall translation code at all — the patches are confined to the binary’s own ELF headers and the termux-exec shim.
How to update and verify the fix
The upgrade path is three commands and takes under a minute on a warm cache. Open Termux, pull the new APK from F-Droid or the GitHub releases page, then inside the terminal run the package refresh. Do not skip the explicit reinstall of proot — pkg upgrade alone occasionally leaves the old binary in place if the hash check races with an in-progress proot-distro session.
pkg update
pkg install --reinstall proot proot-distro termux-exec
proot --version
After the reinstall, confirm the binary is 16 KB-aligned before you try launching a rootfs. The quickest check is readelf against the installed file path. If the LOAD segments report Align 0x4000 you are on the fixed build. If they still show 0x1000 the cache served a stale package and a second pkg install --reinstall proot usually clears it.
If you need more context, power-user customization guide covers the same ground.
readelf -l $PREFIX/bin/proot | grep LOAD
# LOAD 0x000000 0x00000000 0x00000000 0x01234 0x01234 R 0x4000
# LOAD 0x002000 0x00002000 0x00002000 0x05678 0x05678 R E 0x4000
Once proot --version reports the updated build and the alignment is 0x4000, relaunch your distro with proot-distro login debian or whichever rootfs you use. The login should drop you at a guest shell prompt without the Exec format error line. If you previously ran proot-distro install debian before the fix, you do not need to reinstall the rootfs — the alignment problem was in Termux’s own proot, not the guest tarball, for Debian, Ubuntu, and Arch. Only user-built rootfs images compiled with an older NDK need rebuilding.

The breakdown panel above lists the packages the Termux fix touches and summarizes what changed in each: the proot row calls out the --with-page-size=16384 configure flag; the termux-exec row highlights the new runtime AT_PAGESZ probe in exec.c; the libtalloc row notes the alignment-aware talloc_array() rebuild; and the proot-distro row flags the rebuilt Alpine, Arch, and Void tarballs. Readers who use only Debian or Ubuntu rootfs images can skip the tarball re-download because those guests were unaffected.
When PRoot still refuses to launch
A small set of devices and configurations still fail after the upgrade. The most common residual failure is custom kernels that run SELinux in enforcing mode without the u:r:untrusted_app_32:s0 relaxation that Termux relies on. On those kernels proot exits with operation not permitted rather than exec format error, and no Termux update fixes it.
Users running Magisk with the Zygisk module enabled occasionally see a different failure path: the rootfs boots, but the first call to apt update inside Debian hangs for ninety seconds and then returns Could not resolve 'deb.debian.org'. This is a known interaction between Zygisk’s namespace handling and Termux’s networking, and it is unrelated to the PRoot patch. The fix there is to add com.termux to the Zygisk deny list so the module stops injecting into the Termux process.
I wrote about Android’s tightening sandbox if you want to dig deeper.
Devices on earlier 4 KB-page kernels do not need the update at all — the older PRoot binary works fine on those kernels, and installing the new build will cost you the small memory overhead without any functional benefit. Check Settings → About phone → Android version and confirm your build corresponds to a 16 KB-page release before assuming you need the patch.
Live data: top Reddit posts about “termux 0.119 android 15 qpr2” by upvotes.
The Reddit thread snapshot above pulls the top posts from r/termux matching the release and the Android update. The highest-voted post is a Pixel 9 owner confirming proot-distro login arch recovers after the upgrade, quoting a readelf -l output with Align 0x4000 on every LOAD segment. A second post is a user on OxygenOS asking whether the fix lands for OnePlus devices; the answer is yes, once OnePlus ships its own equivalent 16 KB-page build, because the Termux package already carries the alignment change regardless of OEM skin. The remaining posts are about unrelated Termux-X11 regressions in the same release — specifically a cursor-warp bug on HDPI displays — and are not part of the PRoot story.
What this means for proot-distro users going forward
The 16 KB page size transition is not limited to one Android release in the long run. According to Google’s 16 KB page size guidance, the Play Store will require 16 KB-aligned native libraries for app submissions targeting newer Android versions, and the broader AOSP kernel documentation describes the alignment rules device kernels must satisfy. Any tool that relies on ptrace-based userspace virtualization — PRoot, QEMU user-mode, frida-server — will need the same kind of rebuild Termux just applied to proot.
For proot-distro users, that means two practical habits. First, pin the version of any custom rootfs you maintain to a current NDK build and record the alignment flags in your build script next to the existing --target=aarch64-linux-android24 line. Second, if you distribute a rootfs tarball to other Termux users, add a README line calling out the minimum Termux version and a minimum Android build that enforces 16 KB pages. The compatibility matrix for guest binaries is now tighter than it was before, and a tarball compiled on an older sysroot will silently fail to launch on fixed Termux with the same Exec format error message the platform upgrade produced in the first place.
See also Google’s security lockdowns.
The single most valuable action for anyone reading this is to update Termux from F-Droid or the GitHub release page today, reinstall proot explicitly, and confirm readelf -l $PREFIX/bin/proot reports Align 0x4000. Everything else downstream of that — proot-distro, your guest shells, your build tools — depends on that one binary being correctly aligned against the updated kernel’s page requirement.
For a different angle, see update cliff guidance.
Related reading: performance deep dive.
Further reading
- Termux app release notes on GitHub — official changelog history including the PRoot fix.
- termux-packages repository — the source of the
prootbuild script and thetermux-execAT_PAGESZruntime probe. - Android Developers: Support 16 KB page sizes — Google’s page on the Page Size Agnostic requirements and what native binaries must do to comply.
- AOSP kernel documentation: 16 KB page size support — kernel-side explanation of the alignment requirement that tripped older PRoot builds.
- proot-me upstream repository — the upstream PRoot project whose build Termux packages.
