Ir para o conteúdo
PS5PCEM
FuncionaCPU, carregador e ferramentas

Carregamento de ELF e de SELF

O carregador mapeia módulos SELF de PS5 já descriptografados e módulos ELF64 simples, aplica as relocações e resolve as importações contra o registro do HLE. O título então recebe handles estáveis para os módulos que ele mesmo inicia.

Notas do repositório até 10 de outubro de 2026

Imagens

Um executável de PlayStation 5 costuma ser um contêiner SELF em torno de uma imagem ELF64. O PS5PCEM lê tanto o contêiner quanto um ELF simples. O leitor coleta as importações, mapeia os segmentos no espaço de endereçamento reservado do convidado e aplica as relocações. As imagens de TLS são registradas nas threads que vão executá-las.

As ferramentas podem inspecionar um módulo, despejar um grafo de dependências já relocado ou desmontar um shader sem iniciar o título. game-run é o caminho que carrega, inicializa o HLE e entra no convidado. Quando o eboot.bin descriptografado vive separado da instalação, --app0 aponta a montagem somente leitura para o diretório de conteúdo.

Módulos que o título inicia depois

O tempo de execução mapeia o grafo de dependências alcançável, mais tudo o que estiver nomeado em PS5_PRELOAD, antes de o código do convidado rodar. sceKernelLoadStartModule então devolve um handle estável para um módulo desse conjunto. Carregá-lo de novo não cria uma segunda cópia relocada. sceKernelDlsym calcula o hash do nome que o título passou e busca só no módulo que o handle selecionou, então dois plugins que exportam o mesmo callback não se tornam aliases.

A correspondência de caminho ignora a direção da barra e a caixa. Um título observado pede Il2CppUserAssemblies.prx e traz Il2cppUserAssemblies.prx. Uma correspondência exata recusaria um arquivo que o título instalou. O caminho relativo é tentado antes do nome de arquivo nu, então dois módulos que compartilham um nome de arquivo permanecem distintos. Um módulo que não estava no conjunto publicado devolve ENOENT. Ele não é mapeado enquanto threads do convidado já estão em execução.

Plugins do Unity

Plugins do Unity podem ser mapeados com os construtores adiados. sceKernelLoadStartModule então os inicia uma vez, com o bloco real de argumentos do título, em vez de executar esses construtores durante a inicialização do grafo. Essa ordem é a diferença entre um plugin que vê os próprios argumentos e um plugin que começa cedo demais.

O carregador não descriptografa um SELF de varejo. A entrada é uma imagem já descriptografada que o usuário tem direito de carregar. Pacotes criptografados são problema da ferramenta de PKG, e a criptografia de varejo também fica fora dessa ferramenta.

O que está implementado

  • Mapeamento de ELF64 e de SELF descriptografado, com relocação, importações e TLS.
  • Um grafo de dependências pré-carregado e handles estáveis de sceKernelLoadStartModule.
  • Dlsym limitado ao módulo selecionado, com correspondência de caminho sem distinção de caixa.
  • Construtores adiados para plugins do Unity, para que eles iniciem com os argumentos reais.

O que ainda falta

  • Um módulo que só aparece depois da inicialização, e que não foi pré-carregado, devolve ENOENT.
  • Imagens SELF de varejo criptografadas não são descriptografadas.
  • Compilações de inspeção não executam a imagem carregada em anfitriões que não são Windows.

Mecanismos relacionados

O que estas páginas descrevem

O texto segue as notas de arquitetura e os relatórios de outubro de 2026 no repositório do PS5PCEM. Um teste pontual que passa não é uma nova taxa de quadros nem uma nova conclusão de jogo.

Todas as tecnologias