mksh
développeur ici
Le problème avec la distribution de binaires est que les binaires doivent être construits contre la même libc bionic
exacte que votre téléphone fournit, ce qui nécessite à la fois les binaires libc (tels qu'ils sont fournis sur votre téléphone) et les en-têtes de développement (uniquement présents dans l'arbre de source AOSP de la personne qui a construit votre image).
Si vous souhaitez utiliser un binaire mksh ARM générique, vous pouvez utiliser un binaire compilé statiquement contre une autre libc (comme musl
(recommandé), dietlibc
ou klibc
). Cependant, ceux-ci auront des comportements différents de celui fourni par Android :
- Android a un différent chemin par défaut
PATH
, utilisant quelque chose comme /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
au lieu de /usr/bin:/bin
- Android a des répertoires différents pour
/etc
(/system/etc
), /tmp
(/data/local
), et les emplacements de ~/.mkshrc
et le EXECSHELL
par défaut diffèrent
Pour ces raisons, je recommande de conserver votre /system/bin/sh
tel quel et d'ajouter seulement un exécutable /system/bin/mksh
ou même /vendor/bin/mksh
avec une version plus récente si vous en avez vraiment besoin et l'utiliser explicitement dans les scripts et/ou de manière interactive.
Si vous allez sur la page du paquet Debian mksh, vous pouvez télécharger le paquet Debian pour votre architecture (arm64
pour les systèmes ARM 64 bits, armhf
pour ARMv7 32 bits ou plus récent; il est peu probable que vous ayez besoin de versions plus anciennes; le 32 bits peut fonctionner sur des systèmes 64 bits mais pas l'inverse), puis une fois téléchargé sur votre ordinateur local, vous pouvez extraire le paquet comme suit (je vais utiliser la version 32 bits pour cet exemple) :
ar x mksh_57-2_armhf.deb
tar xaf data.tar.*
find usr/lib/ -name \*ksh -ls
La dernière commande listera tous les binaires éventuellement liés statiquement qui ne sont pas fournis avec GNU libc ; pour la version 57-2, la sortie est :
2633594 184 -rwxr-xr-x 1 user user 185584 Sep 26 00:52 usr/lib/arm-linux-musleabihf/bin/mksh
2633596 124 -rwxr-xr-x 1 user user 126816 Sep 26 00:52 usr/lib/klibc/bin/mksh
2633595 152 -rwxr-xr-x 1 user user 152716 Sep 26 00:52 usr/lib/diet/bin/mksh
Vous pouvez donc choisir l'un de ces trois binaires ; je recommande vraiment d'utiliser celui compilé avec musl (c'est-à-dire usr/lib/arm-linux-musleabihf/bin/mksh
, le chemin diffère pour arm64
) car c'est la bibliothèque C la plus correcte et complète.
adb push usr/lib/arm-linux-musleabihf/bin/mksh /sdcard/mksh-new
adb shell
su
mv /sdcard/mksh-new /vendor/bin/mksh
chown 0:0 /vendor/bin/mksh
chmod 555 /vendor/bin/mksh
Maintenant, à moins qu'un autre exécutable mksh
ne se trouve dans le PATH
avant /vendor/bin/
, l'exécution de mksh script.sh
ou simplement de mksh
(ou mksh -l
pour une session shell de connexion) démarrera le binaire plus récent (mais ne lira pas /system/etc/mkshrc
sauf si vous le démarrez avec env ENV=/system/etc/mkshrc mksh
), mais le processus de démarrage du système continuera à utiliser la version pour laquelle il a été conçu et testé. (Les versions plus récentes de mksh
peuvent contenir des correctifs de bogues qui peuvent entraîner l'échec de scripts reposant sur ces bogues ou des interprétations antérieures de la norme POSIX sh.)
Étant également le développeur Debian maintenant le paquet mksh là-bas, vous pouvez considérer ces paquets comme des constructions officielles Linux/ARM de nouvelles versions de mksh (bien qu'elles ne contiennent pas les spécificités d'Android).
Si vous avez vraiment besoin d'un binaire avec les spécificités d'Android, je peux accéder à une box de portage Debian/ARM et compiler mksh à partir de la source, avec les définitions différentes (comme indiqué ci-dessus), et vous le fournir en téléchargement ; contactez-moi (par e-mail ou IRC) si vous en avez besoin, car c'est un effort manuel et cela me prendra du temps supplémentaire.