PRX

From PS3 Developer wiki
Revision as of 00:44, 28 December 2019 by CelesteBlue (talk | contribs) (CelesteBlue moved page SPRX File Format to PRX)
Jump to navigation Jump to search

Overview

Playstation Relocatable Executable (PRX)

Structure

First LOAD segment p_paddr points to module info.

Module Info

Offset Type Description
0 short Module attributes
2 char[2] Module version
4 char[28] Module name
0x20 long TOC address
0x24 long Pointer to the start of exports section
0x28 long Pointer to end of exports section
0x2C long Points to the start of imports section
0x30 long Points to the end of imports section

Exports

Offset Type Description
0 char[2] Structure size (0x1C 32-bit or 0x28 64-bit), padding
2 short Version
4 short Attributes
6 short Number of functions
8 short Number of variables
0xA short Number of thread local storage variables
0xC char Hash info
0xD char Thread local storage hash info
0xE char[2] Reserved
0x10 long Pointer to exported library name
0x14 long Pointer to function NID table
0x18 long Pointer to function stub table

Imports

Offset Type Description
0 char Structure size (0x2C)
1 char Unused
2 short Version
4 short Attributes. AUTO_EXPORT=0x0001, WEAK_EXPORT=0x0002, NOLINK_EXPORT=0x0004, WEAK_IMPORT=0x0008, 0x2000 seems to indicate a non-PRX library (like "stdc" or "allocator") that comes from somewhere else (LV2?)
6 short Number of functions
8 short Number of variables
0xA short Number of thread local storage variables
0xC byte[4] reserved
0x10 long Pointer to imported library name.
0x14 long Pointer to the list of NID's for the exported functions.
0x18 long Pointer to the list of exported functions.
0x1C long var_nid_table
0x20 long var_entry_table
0x24 long tls_nid_table
0x28 long tls_entry_table

Relocations

PS3

Relocations can be found in either PT_SCE_PPURELA segments or SHT_SCE_PPURELA / SHT_RELA sections. RELA relocations are standard relocations while PPURELA relocations have 2 segment (program header) indexes stored in r_sym of r_info.

  • The first index can be extracted with 0x7FFFFF00 as a mask and is used as a base address for r_addend. This sum will be the value applied to the patch.
  • The second index can be extracted with 0x000000FF as a mask and is used as a base address for the target segment to patch and is added to r_offset.
  • The first bit (0x80000000) is also set on earlier PRX's but it is currently unknown what it is used for.