Editing Talk:PRX
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 25: | Line 25: | ||
lv2: prolly calculation via elf header and descriptors, its all in there -- [[User:Mysis|Mysis]] | lv2: prolly calculation via elf header and descriptors, its all in there -- [[User:Mysis|Mysis]] | ||
= PPURELA Segment = | |||
I am not sure why hasn't this been mentioned yet. Its PHDR type value is: 0x700000A4 (PT_SCE_PPURELA). It seems to be just a big table with following entries: | |||
<pre> | |||
struct { | |||
u64 offset; // Offset in the second load segment | |||
u16 unk0; // ??? | |||
u8 index; // Seems that: 0 -> First LOAD segment, 1 -> Second LOAD segment | |||
u8 type; // ??? Not sure what happens when type != 1. | |||
u32 unk1; // ??? | |||
u64 ptr; // Offset of the pointer (while patching add the base address where the segment was allocated). | |||
}; | |||
</pre> | |||
My guess is that this segment is used to patch the addresses of the second LOAD segments like this (this may be wrong, but so far it has been proven to work for my emulator's dynamic loader): | |||
<pre> | |||
for (auto& rel : ppurela_table) { | |||
if (rel.type == 1) { | |||
const u32 addr = prx->load_segments[1].addr + rel.offset; | |||
const u32 value = prx->load_segments[rel.index].addr + rel.ptr; | |||
write32(addr, value); | |||
} | |||
} | |||
</pre> | |||
Has anyone worked on this previously? / Can someone confirm this? -- [[User:AlexAltea|AlexAltea]] |