PS4Recomp — прототип статического рекомпилятора PS4 для Apple Silicon
И вот он, Bloodborne…
Всем привет! Меня не было здесь, наверное, месяца два или три. История вновь пошла по кругу: предыдущий проект, Kakehashi, пришлось закрыть, несмотря на солидное количество звёзд. Причиной стали отсутствие обратной связи и ещё… zsh.
После этого я пробовал разные идеи в надежде, что какая-нибудь приживётся. Около месяца назад взялся за очередной эксперимент: можно ли перекомпилировать x64-приложение под Apple Silicon, а графику при этом вывести через Metal? Меня вдохновил проект AnyPS5, который занимается, скажем так, переносом игр на ПК, и я решил попробовать реализовать нечто подобное.
С чего всё началось
Я не люблю Rosetta 2 и JIT, пользуюсь MacBook Pro на M1 всего с 8 ГБ оперативной памяти и вдобавок сменил нейросеть: раньше писал с Grok 4.5–4.6, а теперь — прости господи — с Gemini 3.8 Flash. Поэтому выбор пал на PS4: сопоставимый объём памяти и множество готовых материалов, в том числе ShadPS4 и OpenOrbis.
Сразу расскажу о процессе разработки. В папке, исключённой через .gitignore, находится репозиторий shadps4 с аналогичной лицензией GPL 2.0. По сути, я копировал его код, переводя с C++ на C, чтобы добиться максимально работоспособного результата. OpenOrbis поначалу использовался только для компиляции тестовых бинарников и изучения заголовочных файлов. Реализацией графики через Metal занимался сторонний разработчик manjarqo вместе со своим Claude Opus. Изначально он собирался помогать моему проекту, но затем решил отделиться и развивать собственный форк, разрешив мне использовать его наработки. За это ему огромное спасибо.
И ещё: я не геймер, поэтому воспринимаю всё происходящее прежде всего как эксперимент.
Принцип работы
Сначала вы скачиваете игру или создаёте её дамп — источник остаётся на ваше усмотрение и под вашу ответственность. Затем обрабатываете файлы сторонней утилитой https://github.com/xXJSONDeruloXx/ps4-pkg-tools и получаете распакованную папку. Похожую функциональность я удалил из своего проекта, чтобы случайно не навлечь на себя претензии Sony. После этого можно запускать сам рекомпилятор. Честно признаюсь: пока он не работает как полностью самостоятельный бинарник, поэтому собирайте его строго по инструкции ниже. Затем выполните команду:
./ps4-recomp 'путь/к/игре/eboot.bin' --app-dir 'путь/к/игре' --copy-resources -o 'путь/к/папке/сборки' -c
Параметр —copy-resources не нужен при каждом запуске: достаточно указать его в первый раз для создания пакета .app. Утилита проанализирует все файлы .prx и eboot, определит функции и символы, используемые игрой и её зависимостями, построит графы и обнаружит таблицы переходов и другие необходимые элементы. Затем будут записаны сгенерированные файлы .s и C, после чего Ninja соберёт бинарник в восемь потоков.
Предупреждаю: проект находится на раннем этапе разработки. При работе с непроверенной игрой сборка в Ninja может завершиться ошибкой. Возможен и другой сценарий: бинарник соберётся, но игра при запуске вылетит или остановится на нереализованном символе OrbisOS.
Что уже работает
На данный момент проверены следующие игры:
-
The Last Of Us Remastered — запускается и работает. На моём Mac производительность составляет около 20 FPS, а на M1 Pro, по словам manjarqo, достигает примерно 90 FPS.
-
Bloodborne: Game of the Year Edition — запускается и позволяет играть. На моём Mac выдаёт примерно 6–20 FPS, но графических ошибок пока много.
-
Hogwarts Legacy — рекомпилируется, но вылетает при инициализации ICU из-за какой-то проблемы с локалями. За несколько дней разобраться с ней не удалось, поэтому работа над игрой пока приостановлена.
-
Hollow Knight: Silksong — рекомпилируется и почти доходит до первого кадра, но вылетает при раскрутке исключений C++. Мой рекомпилятор пока не поддерживает этот механизм, что временно исключает возможность запуска, пожалуй, всех игр на Unity.
Любопытно, что проприетарные и специализированные движки запускаются и работают лучше универсальных.
Структура проекта
В проекте используется целый набор языков:
-
Go — основа проекта; на нём написаны собственный дизассемблер, переводчик инструкций и другие компоненты.
-
C/C++ — используются для runtime проекта, который, проще говоря, реализует инструкции OrbisOS.
-
Objective-C/C++ — применяются в прослойке для работы с Metal, шейдерами, окнами macOS и другими специфичными для платформы возможностями.
Ниже приведён фрагмент README проекта:
├── cmd/
│ ├── ps4-recomp/ # Main CLI entry point
│ └── lifter-difftest-asm/ # AMD64 vs ARM64 differential test harness
└── pkg/
├── analyzer/ # Reachable CFG & instruction coverage analyzer
├── disasm/ # Instruction decoder & jump-table recovery
├── elfloader/ # ELF64/PRX parser & multi-module TLS linker
├── lifter/ # AMD64 to ARM64 assembly lifter (TSO, SIMD, FPU)
├── emitter/ # Assembly partitioner, bridge trampolines & NID shims
└── runtime/ # Host runtime & Orbis/POSIX kernel ABI
├── core/ # Guest context & Mach-O crash handlers
├── kernel/ # Direct memory, sync pools, threading, VFS
└── modules/ # HLE modules (VideoOut, AudioOut, GnmDriver, Pad, etc.)
Инструкция по сборке
Вам понадобится Mac с процессором Apple Silicon. Установите инструменты разработчика командой xcode-select —install, а также Go и зависимости проекта:
brew install cmake ninja freetype ffmpeg
После этого соберите проект:
# 1. Клон репозитория
git clone --recursive https://github.com/wie-project/PS4Recomp.git
cd PS4Recomp
# 2. Собрать зависимости
# SPIRV-Cross (для перевода в Metal):
cd 3rdparty/spirv-cross
clang++ -O3 -std=c++17 -c spirv_cross.cpp spirv_cross_parsed_ir.cpp spirv_parser.cpp spirv_glsl.cpp spirv_msl.cpp spirv_cfg.cpp spirv_cross_c.cpp
ar rcs libspirv-cross.a *.o && rm -f *.o
cd ../..
# LibAtrac9 (для аудио):
cd 3rdparty/libatrac9
clang -O3 -c C/src/*.c
ar rcs libatrac9.a *.o && rm -f *.o
cd ../..
# GCN Shader Recompiler
# Вырезанный и модифицированный manjarqo кусок из shadps4,
# отвечающий за расшифровку шейдеров
cd 3rdparty/gcn-recompiler
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja -C build
cp build/libgcn_recompiler.a .
cd ../..
# 3. Собрать сам бинарник
go build -o ps4-recomp ./cmd/ps4-recomp
Несколько скриншотов



В заключение
Не знаю, как долго продлится этот эксперимент, но, кажется, на этот раз я подошёл к нему лучше подготовленным. Простите за краткость: не хотелось подробно расписывать и расхваливать проект, чтобы снова не вводить никого в заблуждение, если он вдруг закроется из-за отсутствия интереса. Спасибо всем, кто заглянул в репозиторий и заинтересовался работой.
Если хотите помочь проекту или улучшить запуск какой-либо игры, можете даже попросить свою нейросеть подготовить исправления и пул-реквесты — тот же AnyPS5 вполне успешно развивается таким способом. Главное, убедитесь, что она не засоряет проект ненужными файлами .md и не прописывает адреса жёстко или не создаёт костыльные решения для конкретной игры. Реализация должна быть корректной и универсальной, иначе я её не приму. Моя цель — создать статический рекомпилятор для разных игр, а не только для Bloodborne.
Репозиторий: https://github.com/wie-project/PS4Recomp
PlayStation готовит масштабную рекламную кампанию Until Dawn 2 — игра оказалась крайне жестокой
Нейросеть озвучила всю GTA V на русском: как создать 220 часов речи и не вызвать подозрений у санитаров
Rockstar не доверяла секреты GTA V даже исполнителям главных ролей
Phantom Blade Zero начиналась как скромная инди-игра, а теперь её авторы покоряют индустрию
За пять дней на Xbox выйдут 29 игр, в том числе неожиданные новинки
Final Fantasy Resonance не возглавила японский чарт, уступив неожиданной игре
Показали геймплей Smalland 2 — будущего серьёзного конкурента Grounded 2
Nintendo незаметно внесла изменения в Switch 2, благодаря которым консоль стало намного проще ремонтировать