Skip to content

vitasdk/vita-toolchain

Repository files navigation

vita-toolchain

These are a set of tools that, along with an ARM compiler and linker, provides a build system for PlayStation Vita(TM). Look at buildscripts for more information on building the complete toolchain with binutils/gcc/newlib. As such, this repo only contains Vita specific host tools. Check out the specifications for more details on the Vita executable format, these tools, and their inputs/outputs (including the YAML configuration format).

vita-toolchain file formats

name processor description
elf - A normal .elf format
velf vita-elf-create.c The vita's elf format (elf + some module infos)
self - The signed velf file + self headers
fself vita-make-fself.c The self file. but not signed. (fake self)
nid_db_json - really old nid db format
nid_db_classic vita-import-parse.c
vita-nid-db-yml.c
Base of the most used formats currently
nid_db_classic_v2 vita-import-parse.c
vita-nid-db-yml.c
Added library version key to nid_db_classic
nid_db_classic_v3 vita-nid-db-yml.c Added library stubname key to nid_db_classic_v2
nid_db_bypass vita-nid-bypass.c The yml format to bypass duplicate entry names in vita-libs-gen-2
module_config vita-export-parse.c The yml format for more detailed module configuration

vita-elf-create

usage: vita-elf-create [-v|vv|vvv] [-n] [-e config.yml] input.elf output.velf
    -v,-vv,-vvv:    logging verbosity (more v is more verbose)
    -s         :    strip the output ELF
    -n         :    allow empty imports
    -e yml     :    optional config options
    -g yml     :    generate an export config from ELF symbols
    -m list    :    specify the list of module entrypoints
    -p         :    skip stub privilege check
    input.elf  :    input ARM ET_EXEC type ELF
    output.velf:    output ET_SCE_RELEXEC type ELF

Converts a standard ET_EXEC ELF (outputted by arm-vita-eabi-gcc for example) to the Sony ELF format.

vita-elf-create also adds special symbols defined programmatically to module info.

type mode name prototype used by
variable C module_sdk_version const SceUInt32 module_sdk_version; Kernel
variable C sceUserMainThreadName const char sceUserMainThreadName[]; Kernel
variable C sceUserMainThreadPriority const SceUInt32 sceUserMainThreadPriority; Kernel
variable C sceUserMainThreadStackSize const SceSize sceUserMainThreadStackSize; Kernel
variable C sceUserMainThreadCpuAffinityMask const SceUInt32 sceUserMainThreadCpuAffinityMask; Kernel
variable C sceUserMainThreadAttribute const SceUInt32 sceUserMainThreadAttribute; Kernel
variable C sceKernelPreloadModuleInhibit const SceUInt32 sceKernelPreloadModuleInhibit; Kernel
variable C sceLibcHeapUnitSize1MiB unknown SceLibc
variable C sceLibcHeapSize SceSize sceLibcHeapSize; SceLibc
variable C sceLibcHeapInitialSize unknown SceLibc
variable C sceLibcHeapExtendedAlloc unknown SceLibc
variable C sceLibcHeapDelayedAlloc unknown SceLibc
variable C sceLibcHeapDetectOverrun unknown SceLibc
function C user_malloc_init unknown SceLibc
function C user_malloc_finalize unknown SceLibc
function C user_malloc unknown SceLibc
function C user_free unknown SceLibc
function C user_calloc unknown SceLibc
function C user_realloc unknown SceLibc
function C user_memalign unknown SceLibc
function C user_reallocalign unknown SceLibc
function C user_malloc_stats unknown SceLibc
function C user_malloc_stats_fast unknown SceLibc
function C user_malloc_usable_size unknown SceLibc
function C user_malloc_for_tls_init unknown SceLibc
function C user_malloc_for_tls_finalize unknown SceLibc
function C user_malloc_for_tls unknown SceLibc
function C user_free_for_tls unknown SceLibc
function C++ _Z8user_newj user_new(std::size_t) throw(std::badalloc) SceLibc
function C++ _Z8user_newjRKSt9nothrow_t user_new(std::size_t, std::nothrow_t const&) SceLibc
function C++ _Z14user_new_arrayj user_new_array(std::size_t) throw(std::badalloc) SceLibc
function C++ _Z14user_new_arrayjRKSt9nothrow_t user_new_array(std::size_t, std::nothrow_t const&) SceLibc
function C++ _Z11user_deletePv user_delete(void*) SceLibc
function C++ _Z11user_deletePvRKSt9nothrow_t user_delete(void*, std::nothrow_t const&) SceLibc
function C++ _Z17user_delete_arrayPv user_delete_array(void*) SceLibc
function C++ _Z17user_delete_arrayPvRKSt9nothrow_t user_delete_array(void*, std::nothrow_t const&) SceLibc

vita-elf-export

usage: vita-elf-export mod-type elf exports imports
    mod-type: valid values: 'u'/'user' for user mode, else 'k'/'kernel' for kernel mode
    elf: path to the elf produced by the toolchain to be used by vita-elf-create
    exports: path to the config yaml file specifying the module information and exports
    imports: path to write the import yaml generated by this tool

Creates an import database YAML from a Sony ELF and config YAML. This import database is a YAML file (not to be confused with the config YAML file) which defines the NID mappings for a given module. This can be used by other tools for debugging and reversing purposes.

vita-libs-gen

usage: vita-libs-gen nids.yml [extra.yml ...] output-dir
    -c: Generate CMakeLists.txt instead of a Makefile

Given a list of import database YAML files (either from vita-elf-create or manually written by hackers for Sony owned modules), this will generate stub libraries that can be linked to such that vita-elf-create can properly generate a Sony ELF. After calling vita-libs-gen you need to run make or cmake in the output directory to build the stubs.

vita-libs-gen supports nid_db_classic_v2 yml file

Warning: You cannot add more than 1024 entries to a single library in cmake mode.

vita-libs-gen-2

usage: vita-libs-gen-2 -yml=<nids_db.yml|nids_db_yml_dir> -output=<output_dir> [-cmake=<true|false>] [-ignore-stubname=<true|false>]

Enhanced version of vita-libs-gen.

  • better cleeanup for make version
  • no 1024 limite for entries number in cmake mode
  • support multi yml in once
  • support stubname mapping

vita-libs-gen-2 supports nid_db_classic_v3 yml file

vita-nid-check

usage: vita-nid-check -dbdirver=<./path/to/db_dir> [-bypass=<./path/to/bypass.yml>] [-dbg=<debug|trace>] 

Checks all files in the selected directory.

  • Is yml file
  • Is entry sorted
  • Is no duplicated name

Also cannot contain multiple firmware versions within the selected directory.

vita-nid-check supports nid_db_classic_v3 yml file

vita-make-fself

usage: vita-make-fself [-s|-ss] [-c] input.velf output-eboot.bin
    -s : Generate a safe eboot.bin. A safe eboot.bin does not have access
    to restricted APIs and important parts of the filesystem.
    -ss: Generate a secret-safe eboot.bin. Do not use this option if you don't know what it does.
    -c : Enable compression.

Generates a FSELF (the format expected of eboot.bin loaded by Vita) which wraps around the Sony ELF file. Optionally supports compression of the input ELF. Also allows marking a homebrew as "safe", which prevents it from harming the system.

vita-mksfoex

usage: mksfoex [options] TITLE output.sfo
    -d NAME=VALUE   Add a new DWORD value
    -s NAME=STR     Add a new string value

Generates a param.sfo file for a given title. param.sfo is required to launch a homebrew from LiveArea. The TITLE id can be anything but it is recommended that you use XXXXYYYYY where XXXX is an author specific identifier and YYYYY is a unique number identifying your homebrew. For example, molecularShell uses MLCL00001.

vita-pack-vpk

Usage:
    vita-pack-vpk [OPTIONS] output.vpk

  -s, --sfo=param.sfo     sets the param.sfo file
  -b, --eboot=eboot.bin   sets the eboot.bin file
  -a, --add src=dst       adds the file src to the vpk as dst
  -h, --help              displays this help and exit

Generates a VPK homebrew package. eboot.bin and param.sfo are required.

Development

Required libraries are libelf, zlib, libzip, and libyaml. Please note that there are some compatibility problems with built-in libelf so it is recommended that you download it from the provided link.

After getting the dependencies, build with

mkdir build && cd build
cmake ..
make

Note on Naming

Early in the development, there was a confusion on the meaning of "module" and "library" in context of the Vita. After the tools were written initially, we decided to reverse the meaning of those two words. All user-facing usage of those words have been changed (console outputs, messages, etc) but it is too much word to change all internal usage of those words (function/variable names, etc). Therefore you may be confused when reading the source since the meaning of "module" and "library" is used inconsistently. It would be great if someone could take the time to correct all the usages ("module" exports one or more "libraries" and imports zero or more "libraries"; eboot.bin is a module).