Seit Android 15 sind viele Linux-Binärdateien, die bisher mit PRoot liefen, plötzlich unbrauchbar. Der Grund: Der Kernel blockiert kritische Systemaufrufe wie set_robust_list, die PRoot für die Emulation eines Linux-Kernels benötigt. Doch es gibt eine Lösung: Mit patchelf und LD_PRELOAD= lassen sich Debian-Binärdateien direkt ausführen – ohne Root-Zugriff und ohne komplexe Umgebungen.
Warum PRoot unter Android 15 scheitert
PRoot basiert auf der Emulation von Kernelfunktionen durch Systemaufrufe. Doch Android 15 hat den seccomp-Mechanismus verschärft und blockiert nun Funktionen, die für die Ausführung von glibc-Bibliotheken essenziell sind. Das Ergebnis: Binärdateien stürzen mit der Fehlermeldung Bad system call (SIGSYS) ab.
- Seccomp als Sicherheitsmechanismus: Das Systemfilter erlaubt nur ausgewählte Systemaufrufe und verhindert so Angriffe auf den Kernel.
- Termux-Interferenz: Die Umgebung injiziert standardmäßig
libtermux-exec-ld-preload.so, die mit glibc-Bibliotheken kollidiert. - Symlink-Probleme: Von Root erstellte Symlinks in der Debian-Umgebung sind für den Termux-Nutzer nicht zugänglich.
Drei Wege, Debian-Binärdateien auf Android zu nutzen
Je nach Anwendungsfall gibt es unterschiedliche Lösungsansätze – von einfachen Binärdateien bis hin zu komplexen Paketverwaltungen.
Tier 1: Native Ausführung ohne Root
Dieser Ansatz nutzt patchelf, um den Interpreterpfad der Binärdatei auf die glibc-Bibliothek umzuleiten. Anschließend wird die Datei mit LD_PRELOAD= geladen, um Termux-Einmischungen zu verhindern.
patchelf --set-interpreter /home/user/glibc-root/lib/ld-linux-aarch64.so.1 \
/home/user/glibc-root/usr/bin/python3
LD_PRELOAD=/home/user/glibc-root/lib/x86_64-linux-gnu/libc.so.6 \
/home/user/glibc-root/usr/bin/python3 --versionVorteile:
- Echte native Ausführung ohne Emulation.
- Kein Root-Zugriff erforderlich.
- Ideal für einfache Binärdateien wie
gcc,pythonodergit.
Tier 2: Stabilere Lösung mit Root-Rechten
Bei komplexen Abhängigkeiten oder Paketverwaltungen empfiehlt sich ein Wrapper-Skript, das die glibc-Umgebung mit Root-Rechten lädt.
su -c "LD_PRELOAD=/home/user/glibc-root/lib/x86_64-linux-gnu/libc.so.6 \
LD_LIBRARY_PATH=/home/user/glibc-root/lib/aarch64-linux-gnu:\
/home/user/glibc-root/usr/lib/aarch64-linux-gnu \
/home/user/glibc-root/usr/bin/gcc --version"Vorteile:
- Höhere Kompatibilität durch korrekte Abhängigkeitsauflösung.
- Geeignet für Paketmanager wie
apt.
Tier 3: Automatisierte Paketverwaltung mit APT
Ein Wrapper-Skript für apt übernimmt die Installation von Debian-Paketen und passt Binärdateien automatisch an die glibc-Umgebung an. Falls verfügbar, werden zunächst Termux-Pakete genutzt, bevor auf Debian zurückgegriffen wird.
Schritt-für-Schritt-Anleitung für die Einrichtung
Bevor es losgeht, stellen Sie sicher, dass Ihr Gerät die Voraussetzungen erfüllt.
Voraussetzungen
- Root-Zugriff über KernelSU oder Magisk.
- Termux aus der F-Droid-Quelle (nicht aus dem Play Store).
- patchelf installiert:
pkg install patchelf. - Proot-Distro für die Debian-Installation:
pkg install proot-distro.
Warum F-Droid? Die Version aus F-Droid bietet bessere Kompatibilität mit benutzerdefinierten ROMs und ermöglicht den Zugriff auf proot-distro ohne Einschränkungen.
Debian-Installation und Konfiguration
- Debian-RootFS installieren:
pkg install proot-distro rsync -y
proot-distro install debian- Debian-Pakete wie GCC oder Python installieren:
proot-distro login debian -- bash -c "apt-get update && apt-get install -y gcc python3 curl"- RootFS nach `~/glibc-root` kopieren:
GLIBC="$HOME/glibc-root"
mkdir -p "$GLIBC"
rsync -a "$PREFIX/var/lib/proot-distro/installed-rootfs/debian/" "$GLIBC/"- Symlinks reparieren:
Ein Skript korrigiert die Berechtigungen der von Root erstellten Symlinks:
#!/usr/bin/env python3
import os
import stat
def fix_symlinks(rootfs):
for dirpath, _, filenames in os.walk(rootfs):
for filename in filenames:
filepath = os.path.join(dirpath, filename)
if os.path.islink(filepath):
target = os.readlink(filepath)
if not os.path.isabs(target):
new_target = os.path.join(os.path.dirname(filepath), target)
os.remove(filepath)
os.symlink(new_target, filepath)
os.lchmod(filepath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
if __name__ == "__main__":
fix_symlinks(os.path.expanduser("~/glibc-root"))- Binärdateien anpassen und testen:
patchelf --set-interpreter ~/glibc-root/lib/ld-linux-aarch64.so.1 \
~/glibc-root/usr/bin/python3
LD_PRELOAD=~/glibc-root/lib/aarch64-linux-gnu/libc.so.6 \
~/glibc-root/usr/bin/python3 --versionPraktische Anwendungsfälle
Mit dieser Methode lassen sich zahlreiche Linux-Entwicklungswerkzeuge direkt auf dem Android-Gerät nutzen:
- Kompilieren von C/C++-Code mit
gccoderclang. - Ausführen von Skriptsprachen wie Python, Perl oder Node.js.
- Verwendung von Versionsverwaltungstools wie
gitodermercurial. - Nutzung von Paketmanagern wie
aptfür die Installation zusätzlicher Software.
Ausblick: Langfristige Lösungen und Alternativen
Während diese Methode eine sofortige Lösung bietet, arbeiten Entwickler bereits an langfristigen Ansätzen:
- Anpassung von PRoot für die neuen seccomp-Filter.
- Native glibc-Unterstützung in Termux für bessere Kompatibilität.
- Android-Linux-Subsysteme wie Waydroid oder UserLAnd für eine vollständigere Linux-Erfahrung.
Wer regelmäßig mit Linux-Entwicklungstools auf mobilen Geräten arbeitet, sollte diese Methode in sein Arsenal aufnehmen. Sie ermöglicht Produktivität unterwegs – ohne Abhängigkeit von Cloud-Diensten oder externen Servern.
Der Schlüssel zum Erfolg liegt in der korrekten Einrichtung der glibc-Umgebung und der Anpassung der Binärdateien. Mit etwas Geduld lassen sich so auch komplexe Abhängigkeiten zuverlässig auflösen.
KI-Zusammenfassung
Android 15'in getirdiği seccomp kısıtlamaları nedeniyle PRoot kullanılarak Debian uygulamaları çalıştırılamıyor. İşte `patchelf` ve `LD_PRELOAD` ile geliştirdiğimiz yeni yöntemle, uygulamaları doğrudan Termux üzerinde native olarak çalıştırmayı öğrenin.