OpenOrbis PS4 toolchain enables developers to build homebrew without the need of Sony's official Software Development Kit (SDK). It contains the header files, library stubs, and tools to build applications and libraries for the PS4.
The header files as well as the library stubs may need updating to support yet undiscovered functions, so feel free to fork the repository and make pull requests to update support.
All Visual Studio solution files are assumed VS2017 for now. This will change when the .NET core-based projects drop, which will be VS2019 to allow usage of .NET core 3.1.
The following projects will be added to this repo within the next few days:
It was intended for these to drop at the same time as everything else, however both are getting ported to .NET core to be made more future-proof and to allow easier Continuous Integration (CI).
Each tool will have an additional README.md file in it's sub-directory giving more specific information on that project. The docs sub-directory also contains additional materials and documentation. Below is an overview of the purpose of each sub-directory:
- /bin Executables for tools for each platform (Windows in /bin/windows, Linux in /bin/linux and macOS in /bin/macos)
- /docs Documentation for PS4 format specifications (reverse engineered) and the toolchain itself
- /extra Extra / miscellaneous files. Currently, this includes project templates for Visual Studio
- /include Contains header files to compile against when building applications/libraries (PS4 specific files are in /include/orbis
- /lib Contains library stubs to link against when building applications/libraries
- /samples Example programs to get you started and for reference
- /scripts Helpful scripts to view Orbis ELF (OELF) information as well as other various tools
- /src Contains source code for tools (see /src/README.md for more information on this directory)
Creating Homebrew Projects
For Windows, /extra provides Visual Studio templates which can be added into your VS installation's templates directory to allow easy creation of homebrew projects. You can also copy and modify the solutions from the provided samples.
For Linux and macOS, /extra contains a setup-project.sh script which will create a project directory based on the hello_world sample.
Contribution is welcome, the OpenOrbis toolchain is open source after all. For those eager to contribute, we have an actively maintained list of issues on CONTRIBUTING.md that are accessible and would be awesome to get closed. We appreciate anyone who contributes and acknowledgements will be maintained in this README.
Each tool will have a dedicated README.md file for more specific information on the tool. Below is a generic overview of the tools included in the toolchain currently.
The create-eboot tool takes normal Executable Linkable Format (ELF) files and performs the necessary patches and relinking to create an Orbis ELF (OELF). It will further take this OELF and process it into a final wrapped Signed Executable Linkable Format (SELF). This was made possible thanks to flatz' previous work on the make-fself.py script, which can be found in /scripts. For more information on these formats, see the wiki or /docs.
Author: Specter + flatz (fself stuff)
The create-lib tool is similar to the create-eboot tool, however it produces Playstation Relocatable eXecutable (PRX) library files from a given ELF file.
Author: Specter + flatz (fself stuff)
The create-pkg tool takes a set of files that applications are expected to have (eboot.bin, param.sfo, necessary modules, etc.) and creates a package file (pkg) for them to install on the PS4.
The stub-generator generates the header files and shared libraries (.so) files for linking with PS4 system libraries. The output of this tool can be found in /include/orbis and /lib. These directories are essential to properly link with PS4 libraries.
The miralib library contains C# and Python code for interacting with Mira on the desktop side of things. This includes management of a local list of consoles, connecting to a console, and performing various actions once connected via RPC.
Author: Specter + Kiwi
Assistant is actually a suite of tools for aiding in developing PS4 homebrew. This includes a log viewer, a debugger, a launcher for Mira, and a tray application to easily launch all of these.
A replacement readelf tool for reading PS4-compatible ELFs, otherwise known as Orbis ELFs (OELF).
All scripts in the /scripts directory are Python 3 scripts, specifically targeting Python 3.7.0, with the exception of /scripts/make_fself.py. You will need Python installed on your system to run these scripts. Usage of these scripts can be found in /scripts/README.md.
- autobuild.py - is an automated pkg generating script based on project dir content (may be unstable, wait for release build)
- dynamic_entries.py - Gets a list of dynamic entries from the dynamic table of Orbis ELFs.
- make_fself.py - Copy of flatz' script to generate fake SELF files. This functionality has now been integrated as a part of create-eboot and create-lib.
- program_headers.py - Gets a list of program headers from the program header table of Orbis ELFs.
- rela_entries.py - Gets a list of relocation with addend (RELA) entries from the relocation table of Orbis ELFs.
- symbol_entries.py - Gets a list of symbols from the symbol table of Orbis ELFs.
This project is licensed under the GPLv3 license - see the LICENSE file for details.
The accompanying LLVM binaries are licensed under the Apache 2.0 license and is owned by LLVM. Under that license, redistribution is allowed.
Credits + Special Thanks
- Specter: Create-eboot/lib relinker, miralib, assistant suite, readelf, samples and documentation
- CrazyVoid: Stub generator, headers, samples and documentation
- maxton: Create-pkg pkg and SFO generation tools
- Kiwidog: Mira stuff, documentation
- IDC: Lots of help with libraries and other bug fixes
- flatz: Homebrew research and writeups, SELF reversing and documentation
- m0rph3us1987: Help with debugging stuff
- bigboss / psxdev: Library research and reverse engineering, used for reference by various samples
- LightningMods / LM: Testing via APP_HOME and lib loading help on the Mira side
- Lord Friky: Proper macOS support
- MrSlick: Awesome logo ❤️
- OpenOrbis Team
- Other anonymous contributors
Que novedades incluye la versión 0.5
The toolchain now includes stub/empty libc and libSceFios2 modules to avoid breaking non-homebrew games and applications!
- Note: This change works in conjunction with Mira, meaning you'll want to update the version of Mira you're loading as well.
- Additional note: these modules can be found in /bin/data/modules/libc.prx and /bin/data/modules/libSceFios2.prx, and should be placed in sce_module/ in your homebrew's package file.
- SDL2 headers as well as a mini game sample have now been added (thanks znullptr for the original SDL port)!
- C++ threading (std::thread) support has been added!
- C++ locking / synchronization support has been added!
- Fixed a performance issue in create-eboot, giving it a 7858% performance boost (measured with the SDL sample)!
- Visual studio project templates now support and link with C++ by default.
- Added various macros and function definitions to libkernel, libScePad, libSceUserService, and libSceVideoOut, as well as documentation for these additions.
- Added right.prx by IDC to all samples (thanks IDC for right.prx).
- Slightly adjusted sample pkg gp4 files to use the same eboot.bin created by build scripts instead of unnecessarily using a copy.
- Fixed jagged text rendering in /samples/_common/graphics.cpp due to not factoring in the freetype greyscale bitmap alpha properly.
- Buffering is now disabled on stdout automatically due to it not handling buffering well.
- Updated pthread header to use PS4/BSD-specific values.
- Samples now have DWARF / debug symbols included by default (thanks sleirsgoevy).
- Reworked the threading sample to use std::thread and std::mutex now that C++ threading is supported.
- Reworked the networking sample to a TCP server instead of a TCP client.
- Fixed an issue where a really silly FreeBSD change broke any networking functions that need to use the sockaddr struct such as bind.
- Fixed an issue where GP4 project files were using non-portable windows-style path separators (thanks sleirsgoevy).
- Fixed an issue where the non-sce sleep() function didn't work due to a MUSL-related issues (thanks LM, ChendoChap).
- Fixed an issue where SPRX visual studio projects contained a typo in an include statement and an incorrect set of libraries for the build script.
- Fixed the cmath c++ header, which included using statements for functions that are macros on FreeBSD targets (thanks kiwidog).
- Fixed an issue where the sockaddr_in structure was incorrect due to a discrepancy between Linux and FreeBSD (thanks kiwidog).
- Fixed an issue where the pipe() function didn't work due to a discrepancy between Linux and FreeBSD (thanks sleirsgoevy).
- Fixed an issue where AF_INET6 was erroneously set to 10 due to a discrepancy between Linux and FreeBSD (thanks sleirsgoevy).