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.
|