4 votes

Mettre à jour mksh vers la dernière version

Android est livré avec mksh en tant que shell, comment puis-je passer à la dernière version (maintenant R57, le mien est toujours sur R43) ?

Le site officiel https://www.mirbsd.org/mksh.htm propose de compiler à partir de la source, quelqu'un construit des binaires prêts à l'emploi ?

11voto

Stu Points 169

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.

1 votes

Meilleur support en IRC ou par mail ;) Je vais supprimer les commentaires ici pour ne pas être bavard.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X