Um projeto para colocar um shell Linux em execução no iOS, usando a emulação Usermode x86 e a tradução do Syscall.
Para o status atual do projeto, verifique a guia Problemas e os logs de confirmação.
Este projeto possui um submódulo Git, clonar com --recurse-submodules ou executar git submodule update --init após a clonagem.
Você precisará dessas coisas para construir o projeto:
pip3 install meson )brew install llvm , no Linux, sudo apt install clang lld ou sudo pacman -S clang lld ou o que seja)sudo apt install libsqlite3-dev . Se nãobrew install libarchive , sudo port install libarchive , sudo apt install libarchive-dev ) TODO: Bacione esta dependência Abra o projeto no Xcode, abra o ish.xcconfig e altere ROOT_BUNDLE_IDENTIFIER para algo único. Você também precisará atualizar o ID da equipe de desenvolvimento no projeto (não alvo!) Configurações de construção. Em seguida, clique em Executar. Existem scripts que devem fazer todo o resto automaticamente. Se você tiver algum problema, abra um problema e tentarei ajudar.
Para configurar seu ambiente, o CD para o projeto e execute meson build para criar um diretório de compilação no build . Em seguida, CD para o diretório de construção e execute ninja .
Para configurar um sistema de arquivos Linux Alpine independente, faça o download do alpine Minirootfs Tarball para i386 no site Alpine e execute ./tools/fakefsify , com o Minirootfs Tarball como o primeiro argumento e o nome do diretório de saída como o segundo argumento. Em seguida, você pode executar as coisas dentro do sistema de arquivos Alpine com ./ish -f alpine /bin/sh , assumindo que o diretório de saída seja chamado alpine . Se tools/fakefsify não existir para você em seu diretório de construção, isso pode ser porque não conseguiu encontrar o LBARCHIVE no seu sistema (veja acima para obter maneiras de instalá -lo.)
Você pode substituir ish por tools/ptraceomatic para executar o programa em um processo real e uma etapa única e comparar os registros em cada etapa. Eu o uso para depuração. Requer Linux 4.11 de 64 bits ou posterior.
O ISH possui vários canais de registro que podem ser ativados no horário de construção. Por padrão, todos eles estão desativados. Para habilitá -los:
ISH_LOG em ish.xcconfig em uma lista separada por espaço de canais de log.meson configure -Dlog="<space-separated list of log channels>" .Canais disponíveis:
strace : o canal mais útil, registra os parâmetros e o valor de retorno de quase todas as chamadas de sistema.instr : registra todas as instruções executadas pelo emulador. Isso diminui muito as coisas.verbose : logs de depuração que não se encaixam em outra categoria.DEFAULT_CHANNEL para ver se mais canais de log foram adicionados desde que esta lista foi atualizada.Possivelmente a coisa mais interessante que escrevi como parte do ISH é o intérprete. Não é um JIT, pois não tem como alvo o código da máquina. Em vez disso, gera uma variedade de ponteiros para as funções chamadas gadgets, e cada dispositivo termina com uma escala de cauda para a próxima função; Como a técnica de código rosqueado usado por alguns intérpretes. O resultado é uma aceleração de aproximadamente 3-5x em comparação com a emulação usando um switch mais simples.
Infelizmente, tomei a decisão de escrever quase todos os gadgets no idioma da Assembléia. Provavelmente, essa foi uma boa decisão em relação ao desempenho (embora nunca tenha certeza de ter certeza), mas uma decisão horrível em relação à legibilidade, manutenção e minha sanidade. A quantidade de besteira que tive que suportar do compilador/assembler/vinculador é insana. É como se houvesse um demônio lá que garante que meu código seja suficientemente deformado e, se não, invente razões estúpidas pelas quais não deveria compilar. Para permanecer sã ao escrever esse código, tive que ignorar as melhores práticas na estrutura e nomeação do código. Você encontrará macros e variáveis com nomes descritivos como ss e s e a As macros do assembler aninhadas além da crença. E para completar, quase não há comentários.
Portanto, um aviso: a exposição a longo prazo a esse código pode causar perda de sanidade, pesadelos sobre macros e erros de linker a gás ou qualquer número de outros efeitos colaterais debilitantes. Este código é conhecido pelo Estado da Califórnia para causar câncer, defeitos congênitos e danos reprodutivos.