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