Перейти к содержимому
PS5PCEM
РаботаетПроцессор, загрузчик и инструменты

Загрузка ELF и SELF

Загрузчик отображает расшифрованные модули PS5 SELF и голый ELF64, применяет перемещения и разрешает импорты по реестру HLE. Затем игра получает устойчивые описатели модулей, которые запускает сама.

Заметки репозитория по 10 октября 2026 г.

Образы

Исполняемый файл PlayStation 5 обычно представляет собой контейнер SELF вокруг образа ELF64. PS5PCEM читает и контейнер, и голый ELF. Читатель собирает импорты, отображает сегменты в зарезервированное гостевое адресное пространство и применяет перемещения. Образы TLS регистрируются у потоков, которые будут их исполнять.

Инструменты могут осмотреть модуль, выгрузить перемещённый граф зависимостей или дизассемблировать шейдер, не запуская игру. game-run — это путь, который загружает, инициализирует HLE и входит в гостя. Когда расшифрованный eboot.bin лежит отдельно от установки, --app0 направляет монтирование только для чтения на каталог содержимого.

Модули, которые игра запускает позже

Среда выполнения отображает достижимый граф зависимостей плюс всё, что названо в PS5_PRELOAD, до исполнения гостевого кода. Затем sceKernelLoadStartModule возвращает устойчивый описатель модуля из этого набора. Повторная загрузка не создаёт вторую перемещённую копию. sceKernelDlsym хеширует имя, которое передала игра, и ищет только в модуле, который выбрал описатель, поэтому два плагина, экспортирующие один и тот же обратный вызов, не становятся псевдонимами.

Сопоставление путей игнорирует направление косой черты и регистр. Одна наблюдавшаяся игра просит Il2CppUserAssemblies.prx, а поставляет Il2cppUserAssemblies.prx. Точное совпадение отказало бы файлу, который игра установила. Относительный путь пробуется раньше голого имени файла, поэтому два модуля с общим именем файла остаются различными. Модуль, которого не было в опубликованном наборе, возвращает ENOENT. Он не отображается, пока гостевые потоки уже исполняются.

Плагины Unity

Плагины Unity можно отобразить с отложенными конструкторами. Затем sceKernelLoadStartModule запускает их один раз, с настоящим блоком аргументов игры, вместо того чтобы исполнять эти конструкторы во время инициализации графа. Этот порядок — разница между плагином, который видит свои аргументы, и плагином, который стартует слишком рано.

Загрузчик не расшифровывает розничный SELF. На входе — расшифрованный образ, который пользователь вправе загрузить. Зашифрованные пакеты — задача инструмента PKG, и розничное шифрование вне этого инструмента тоже.

Что реализовано

  • Отображение ELF64 и расшифрованного SELF, перемещения, импорты и TLS.
  • Предзагруженный граф зависимостей и устойчивые описатели sceKernelLoadStartModule.
  • Dlsym, ограниченный выбранным модулем, с сопоставлением путей без учёта регистра.
  • Отложенные конструкторы плагинов Unity, чтобы они стартовали с настоящими аргументами.

Чего ещё нет

  • Модуль, который появляется только после запуска и не был предзагружен, возвращает ENOENT.
  • Зашифрованные розничные образы SELF не расшифровываются.
  • Сборки осмотра не исполняют загруженный образ на хостах не Windows.

Связанные механизмы

Чему посвящены эти страницы

Текст следует архитектурным заметкам и отчётам октября 2026 года в репозитории PS5PCEM. Пройденный точечный тест — это не новая частота кадров и не новое прохождение.

Все технологии