Saltar al contenido
PS5PCEM
FuncionaCPU, cargador y herramientas

Carga de ELF y SELF

El cargador mapea módulos SELF de PS5 descifrados y ELF64 desnudos, aplica reubicaciones y resuelve las importaciones contra el registro HLE. El título recibe después handles estables para los módulos que él mismo arranca.

Notas del repositorio hasta el 10 de octubre de 2026

Imágenes

Un ejecutable de PlayStation 5 suele ser un contenedor SELF alrededor de una imagen ELF64. PS5PCEM lee tanto el contenedor como un ELF desnudo. El lector recoge las importaciones, mapea los segmentos en el espacio de direcciones reservado del invitado y aplica las reubicaciones. Las imágenes TLS se registran en los hilos que van a ejecutarlas.

Las herramientas pueden inspeccionar un módulo, volcar un grafo de dependencias reubicado o desensamblar un shader sin arrancar el título. game-run es la ruta que carga, inicializa HLE y entra en el invitado. Cuando el eboot.bin descifrado vive aparte de la instalación, --app0 apunta el montaje de solo lectura al directorio de contenido.

Módulos que el título arranca más tarde

El entorno de ejecución mapea el grafo de dependencias alcanzable, más todo lo nombrado en PS5_PRELOAD, antes de que corra el código invitado. sceKernelLoadStartModule devuelve entonces un handle estable para un módulo de ese conjunto. Cargarlo otra vez no crea una segunda copia reubicada. sceKernelDlsym hashea el nombre que pasó el título y busca solo en el módulo que seleccionó el handle, de modo que dos complementos que exportan el mismo callback no quedan en alias.

La coincidencia de rutas ignora la dirección de las barras y las mayúsculas. Un título observado pide Il2CppUserAssemblies.prx y distribuye Il2cppUserAssemblies.prx. Una coincidencia exacta rechazaría un archivo que el título instaló. La ruta relativa se prueba antes del nombre de archivo desnudo, de modo que dos módulos que comparten nombre de archivo siguen siendo distintos. Un módulo que no estaba en el conjunto publicado devuelve ENOENT. No se mapea mientras los hilos invitados ya están en ejecución.

Complementos de Unity

Los complementos de Unity pueden mapearse con sus constructores diferidos. sceKernelLoadStartModule los arranca entonces una sola vez, con el bloque de argumentos real del título, en lugar de ejecutar esos constructores durante la inicialización del grafo. Ese orden es la diferencia entre un complemento que ve sus argumentos y un complemento que arranca demasiado pronto.

El cargador no descifra un SELF comercial. La entrada es una imagen descifrada que el usuario tiene derecho a cargar. Los paquetes cifrados son asunto de la herramienta de PKG, y el cifrado comercial también queda fuera de esa herramienta.

Qué está implementado

  • Mapeo, reubicación, importaciones y TLS de ELF64 y de SELF descifrado.
  • Un grafo de dependencias precargado y handles estables de sceKernelLoadStartModule.
  • Dlsym limitado al módulo seleccionado, con coincidencia de rutas sin distinguir mayúsculas.
  • Constructores diferidos para los complementos de Unity, de modo que arrancan con los argumentos reales.

Qué falta todavía

  • Un módulo que aparece solo después del arranque, y que no se precargó, devuelve ENOENT.
  • Las imágenes SELF comerciales cifradas no se descifran.
  • Las compilaciones de inspección no ejecutan la imagen cargada en anfitriones que no son Windows.

Mecanismos relacionados

Qué describen estas páginas

El texto sigue las notas de arquitectura y los informes de octubre de 2026 del repositorio PS5PCEM. Un test concreto que pasa no es una tasa de fotogramas nueva ni una partida terminada nueva.

Todas las tecnologías