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 随后为该集合中的模块返回一个稳定句柄。再次加载它不会创建第二份重定位后的拷贝。sceKernelDlsym 对游戏传入的名称做哈希,并且只搜索句柄所选中的模块,因此两个导出同一回调的插件不会别名到一起。
路径匹配忽略斜杠方向和大小写。一个被观察到的游戏请求 Il2CppUserAssemblies.prx,发行的却是 Il2cppUserAssemblies.prx。精确匹配会拒绝游戏已经安装的文件。相对路径会先于裸文件名尝试,因此两个文件名相同的模块仍然分开。不在已发布集合里的模块返回 ENOENT。客户机线程已经在运行时,它不会被映射。
Unity 插件
Unity 插件可以在推迟构造函数的情况下映射。sceKernelLoadStartModule 随后用游戏真实的参数块把它们启动一次,而不是在依赖图初始化期间运行那些构造函数。这个顺序就是插件看得到自己的参数,和插件启动得太早之间的差别。
加载器不解密零售 SELF。输入是用户有权加载的已解密映像。加密包是 PKG 工具的问题,零售加密同样在那个工具之外。
已经实现的部分
- ELF64 和已解密 SELF 的映射、重定位、导入和 TLS。
- 预加载的依赖图,以及稳定的 sceKernelLoadStartModule 句柄。
- Dlsym 只限于被选中的模块,路径匹配不区分大小写。
- Unity 插件的构造函数被推迟,使它们带着真实参数启动。
尚未实现的部分
- 只在启动之后才出现、并且没有预加载的模块,返回 ENOENT。
- 加密的零售 SELF 映像不会被解密。
- 检查用构建在非 Windows 主机上不会执行已加载的映像。
相关机制
这些页面说明什么