NSO: Difference between revisions

Undo revision 1894 by Aerosoul (talk) Removed info which appears to be directly from SDK.
No edit summary
Line 3: Line 3:
It starts with the "NSO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers):
It starts with the "NSO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers):


=== SegmentHeader ===
= NSO Header =
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 4
| file offset of data
|-
| 0x4
| 4
| memory offset loaded to
|-
| 0x8
| 4
| size of data copied to memory offset (i.e. size after decompression)
|-
| 0xC
| 4
| alignment used on memory size / size of .bss in the case of .data segment
|}
 
=== .rodata-relative extent ===
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 4
| offset (relative to .rodata)
|-
| 0x4
| 4
| size of region
|}
 
=== NSO Header ===
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
Line 68: Line 28:
| 0x10
| 0x10
| 0x10 * 3
| 0x10 * 3
| SegmentHeader for each segment
| SegmentHeader[3]
|-
|-
| 0x40
| 0x40
Line 76: Line 36:
| 0x60
| 0x60
| 0x4 * 3
| 0x4 * 3
| file size of each segment (i.e. LZ4-compressed size)
| CompressedSize[3]
|-
|-
| 0x6c
| 0x6c
Line 102: Line 62:
For example, the MOD header is essentially a replacement for a PT_DYNAMIC program header.
For example, the MOD header is essentially a replacement for a PT_DYNAMIC program header.


=== MOD ===
== SegmentHeader ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 4
| FileOffset
|-
| 0x4
| 4
| MemoryOffset
|-
| 0x8
| 4
| DecompressedSize
|-
| 0xC
| 4
| UnkOffset/UnkSize/BssSize
|}
 
== .rodata-relative extent ==
{| class="wikitable" border="1"
|-
! Offset
! Size
! Description
|-
| 0x0
| 4
| RegionRoDataOffset
|-
| 0x4
| 4
| RegionSize
|}
 
== MOD ==
All offsets are signed 32bit values relative to the magic field.
All offsets are signed 32bit values relative to the magic field.
The 32bits at image base + 4 must point to the magic field.
The 32bits at image base + 4 must point to the magic field.
Line 115: Line 115:
| 0x00
| 0x00
| 4
| 4
| zero padding
| ZeroPadding
|-
|-
| 0x04
| 0x04
| 4
| 4
| offset to magic. Always 8 (so it works when MOD is at image_base + 0).
| MagicOffset. Always 8 (so it works when MOD is at image_base + 0).
|-
|-
| 0x08
| 0x08
| 4
| 4
| magic "MOD0"
| Magic "MOD0"
|-
|-
| 0x0C
| 0x0C