Un projet pour faire fonctionner un shell Linux sur iOS, en utilisant l'émulation Usermode x86 et la traduction syscall.
Pour l'état actuel du projet, vérifiez l'onglet Issues et les journaux de validation.
Ce projet a un sous-module GIT, assurez-vous de cloner avec --recurse-submodules ou d'exécuter git submodule update --init après le clonage.
Vous aurez besoin de ces choses pour construire le projet:
pip3 install meson )brew install llvm , sur Linux, sudo apt install clang lld ou sudo pacman -S clang lld ou autre)sudo apt install libsqlite3-dev )brew install libarchive , sudo port install libarchive , sudo apt install libarchive-dev ) todo: bundle cette dépendance Ouvrez le projet dans Xcode, ouvrez Ish.xcConfig et modifiez ROOT_BUNDLE_IDENTIFIER à quelque chose d'unique. Vous devrez également mettre à jour l'ID d'équipe de développement dans les paramètres de construction du projet (pas cible!). Puis cliquez sur Exécuter. Il y a des scripts qui devraient faire tout le reste automatiquement. Si vous rencontrez des problèmes, ouvrez un problème et j'essaierai d'aider.
Pour configurer votre environnement, CD au projet et exécutez meson build pour créer un répertoire de construction dans build . Ensuite, CD au répertoire de construction et exécutez ninja .
Pour configurer un système de fichiers alpin Linux autonome, téléchargez le tarball alpine Minirootfs pour i386 à partir du site Web Alpine et exécutez ./tools/fakefsify , avec le Tarball de Minirootfs comme premier argument et le nom du répertoire de sortie comme deuxième argument. Ensuite, vous pouvez exécuter des choses à l'intérieur du système de fichiers alpin avec ./ish -f alpine /bin/sh , en supposant que le répertoire de sortie est appelé alpine . Si tools/fakefsify n'existe pas pour vous dans votre répertoire de construction, cela pourrait être parce qu'il n'a pas pu trouver Libarchive sur votre système (voir ci-dessus pour les moyens de l'installer.)
Vous pouvez remplacer ish par tools/ptraceomatic pour exécuter le programme dans un processus réel et une seule étape et comparer les registres à chaque étape. Je l'utilise pour le débogage. Nécessite 64 bits Linux 4.11 ou version ultérieure.
ISH possède plusieurs canaux de journalisation qui peuvent être activés au moment de la construction. Par défaut, tous sont désactivés. Pour leur permettre:
ISH_LOG dans ISH.XCCONFIG sur une liste de canaux de journal séparés par l'espace.meson configure -Dlog="<space-separated list of log channels>" .Canaux disponibles:
strace : le canal le plus utile, enregistre les paramètres et la valeur de retour de presque tous les appels système.instr : enregistre toutes les instructions exécutées par l'émulateur. Cela ralentit beaucoup les choses.verbose : les journaux de débogage qui ne correspondent pas à une autre catégorie.DEFAULT_CHANNEL pour voir si davantage de canaux de journal ont été ajoutés depuis que cette liste a été mise à jour.Peut-être la chose la plus intéressante que j'ai écrite dans le cadre d'Ish est l'interprète. Ce n'est pas tout à fait un JIT car il ne cible pas le code machine. Au lieu de cela, il génère un tableau de pointeurs vers des fonctions appelées gadgets, et chaque gadget se termine par un tuze à la fonction suivante; Comme la technique du code fileté utilisé par certains interprètes. Le résultat est une accélération d'environ 3-5x par rapport à l'émulation à l'aide d'une répartition de commutation plus simple.
Malheureusement, j'ai pris la décision d'écrire presque tous les gadgets du langage de l'assemblage. C'était probablement une bonne décision en ce qui concerne la performance (bien que je ne le saurai jamais avec certitude), mais une décision horrible en ce qui concerne la lisibilité, la maintenabilité et ma santé mentale. La quantité de conneries que j'ai dû supporter du compilateur / assembleur / linker est folle. C'est comme s'il y avait un démon là-dedans qui s'assure que mon code est suffisamment déformé, et sinon, constitue des raisons stupides pour lesquelles il ne devrait pas se compiler. Afin de rester sain d'esprit lors de l'écriture de ce code, j'ai dû ignorer les meilleures pratiques dans la structure du code et la dénomination. Vous trouverez des macros et des variables avec des noms descriptifs tels que ss et s et a Les macros assembleurs imbriqués au-delà de la croyance. Et pour couronner le tout, il n'y a presque pas de commentaires.
Ainsi, un avertissement: une exposition à long terme à ce code peut entraîner une perte de santé mentale, des cauchemars sur les macros de gaz et les erreurs de liaison, ou un certain nombre d'autres effets secondaires débilitants. Ce code est connu de l'État de Californie pour provoquer un cancer, des malformations congénitales et des dommages reproductifs.