Laden von ELF und SELF
Der Lader bildet entschlüsselte PS5-SELF- und nackte ELF64-Module ab, wendet Relokationen an und löst Importe gegen die HLE-Registrierung auf. Der Titel erhält danach stabile Handles für Module, die er selbst startet.
Repository-Notizen bis 10. Oktober 2026
Abbilder
Eine ausführbare Datei der PlayStation 5 ist gewöhnlich ein SELF-Container um ein ELF64-Abbild. PS5PCEM liest sowohl den Container als auch ein nacktes ELF. Der Leser sammelt Importe, bildet Segmente in den reservierten Gastadressraum ab und wendet Relokationen an. TLS-Abbilder werden bei den Threads registriert, die sie ausführen werden.
Die Werkzeuge können ein Modul untersuchen, einen relokierten Abhängigkeitsgraphen ausgeben oder einen Shader disassemblieren, ohne den Titel zu starten. game-run ist der Pfad, der lädt, HLE initialisiert und den Gast betritt. Wenn die entschlüsselte eboot.bin getrennt von der Installation liegt, richtet --app0 den nur lesbaren Mount auf das Inhaltsverzeichnis.
Module, die der Titel später startet
Die Laufzeit bildet den erreichbaren Abhängigkeitsgraphen ab, plus alles, was in PS5_PRELOAD genannt ist, bevor Gastcode läuft. sceKernelLoadStartModule gibt danach ein stabiles Handle für ein Modul in dieser Menge zurück. Es erneut zu laden erzeugt keine zweite relokierte Kopie. sceKernelDlsym hasht den Namen, den der Titel übergeben hat, und sucht nur in dem Modul, das das Handle gewählt hat, sodass zwei Plug-ins, die denselben Rückruf exportieren, nicht als Alias zusammenfallen.
Der Pfadvergleich ignoriert die Richtung des Schrägstrichs und die Groß- und Kleinschreibung. Ein beobachteter Titel verlangt Il2CppUserAssemblies.prx und liefert Il2cppUserAssemblies.prx. Ein exakter Vergleich würde eine Datei ablehnen, die der Titel installiert hat. Der relative Pfad wird vor dem nackten Dateinamen versucht, sodass zwei Module, die sich einen Dateinamen teilen, unterscheidbar bleiben. Ein Modul, das nicht in der veröffentlichten Menge stand, liefert ENOENT. Es wird nicht abgebildet, während Gast-Threads bereits laufen.
Unity-Plug-ins
Unity-Plug-ins können mit aufgeschobenen Konstruktoren abgebildet werden. sceKernelLoadStartModule startet sie danach einmal, mit dem echten Argumentblock des Titels, statt diese Konstruktoren während der Initialisierung des Graphen auszuführen. Diese Reihenfolge ist der Unterschied zwischen einem Plug-in, das seine Argumente sieht, und einem Plug-in, das zu früh startet.
Der Lader entschlüsselt kein Retail-SELF. Die Eingabe ist ein entschlüsseltes Abbild, das zu laden der Nutzer berechtigt ist. Verschlüsselte Pakete sind Sache des PKG-Werkzeugs, und die Retail-Verschlüsselung liegt auch außerhalb dieses Werkzeugs.
Was umgesetzt ist
- Abbildung von ELF64 und entschlüsseltem SELF, Relokation, Importe und TLS.
- Ein vorgeladener Abhängigkeitsgraph und stabile Handles von sceKernelLoadStartModule.
- Dlsym begrenzt auf das gewählte Modul, mit Pfadvergleich ohne Beachtung der Groß- und Kleinschreibung.
- Aufgeschobene Konstruktoren für Unity-Plug-ins, damit sie mit den echten Argumenten starten.
Was noch fehlt
- Ein Modul, das erst nach dem Start erscheint und nicht vorgeladen wurde, liefert ENOENT.
- Verschlüsselte Retail-SELF-Abbilder werden nicht entschlüsselt.
- Inspektions-Builds führen das geladene Abbild auf Hosts, die nicht Windows sind, nicht aus.
Verwandte Mechanismen
Worum es auf diesen Seiten geht