ELF と SELF の読み込み
ローダーは復号済みの PS5 の SELF と素の ELF64 のモジュールをマップし、再配置を適用し、インポートを HLE の登録と照合して解決します。その後、タイトルは自分で起動するモジュールの安定したハンドルを受け取ります。
2026年10月10日 までのリポジトリノート
イメージ
PlayStation 5 の実行ファイルは、たいてい ELF64 のイメージを包む SELF のコンテナです。PS5PCEM はコンテナと素の ELF の両方を読みます。読み取り処理はインポートを集め、セグメントを予約済みのゲストのアドレス空間にマップし、再配置を適用します。TLS のイメージは、それを実行するスレッドとともに登録されます。
ツールは、タイトルを起動せずに、モジュールを調べたり、再配置済みの依存グラフを出力したり、シェーダーを逆アセンブルしたりできます。game-run は、読み込み、HLE の初期化、ゲストへの突入を行う経路です。復号した eboot.bin がインストールとは別の場所にある場合、--app0 で読み取り専用のマウントをコンテンツのディレクトリに向けます。
タイトルが後から起動するモジュール
ランタイムは、ゲストのコードが動く前に、たどれる依存グラフと PS5_PRELOAD で指定したものをマップします。その後 sceKernelLoadStartModule は、その集合にあるモジュールに対して安定したハンドルを返します。もう一度読み込んでも、2 つ目の再配置済みのコピーは作られません。sceKernelDlsym はタイトルが渡した名前をハッシュし、ハンドルが選んだモジュールだけを検索するため、同じコールバックをエクスポートする 2 つのプラグインが混ざることはありません。
パスの照合は、スラッシュの向きと大文字小文字を無視します。観測したあるタイトルは Il2CppUserAssemblies.prx を要求し、実際には Il2cppUserAssemblies.prx を同梱しています。完全一致では、タイトルがインストールしたファイルを拒否してしまいます。素のファイル名より先に相対パスを試すため、ファイル名が同じ 2 つのモジュールは区別されたままです。公開された集合になかったモジュールは ENOENT を返します。ゲストのスレッドがすでに動いている間にマップすることはしません。
Unity のプラグイン
Unity のプラグインは、コンストラクターを遅らせてマップできます。その後 sceKernelLoadStartModule が、グラフの初期化中にそれらのコンストラクターを走らせるのではなく、タイトルの本物の引数ブロックで一度だけ起動します。この順序が、引数を受け取れるプラグインと早く起動しすぎるプラグインの違いになります。
ローダーは製品版の SELF を復号しません。入力は、ユーザーが読み込む権利を持つ復号済みのイメージです。暗号化されたパッケージは PKG ツールの領分で、製品版の暗号化はそのツールの範囲外でもあります。
実装済みのこと
- ELF64 と復号済みの SELF のマップ、再配置、インポート、TLS。
- 事前に読み込んだ依存グラフと、安定した sceKernelLoadStartModule のハンドル。
- 大文字小文字を区別しないパスの照合を伴う、選んだモジュールに限定した Dlsym。
- 本物の引数で起動できるよう、Unity のプラグインのコンストラクターを遅延。
まだ足りないこと
- 起動後にだけ現れ、事前に読み込まれていなかったモジュールは ENOENT を返します。
- 暗号化された製品版の SELF のイメージは復号しません。
- 検査用のビルドは、Windows 以外のホストでは読み込んだイメージを実行しません。
関連するしくみ
これらのページについて