NSO: Difference between revisions
No edit summary |
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). If the segments are compressed, they are compressed using LZ4. | It starts with the "NSO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers). If the segments are compressed, they are compressed using LZ4. | ||
= | = NsoHeader = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 12: | Line 12: | ||
| 0x0 | | 0x0 | ||
| 4 | | 4 | ||
| | | Signature ("NSO0") | ||
|- | |- | ||
| 0x4 | | 0x4 | ||
| 4 | | 4 | ||
| Version | | Version | ||
|- | |- | ||
| 0x8 | | 0x8 | ||
Line 27: | Line 27: | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
| | | 0x4 | ||
| | | TextFileOffset | ||
|- | |||
| 0x14 | |||
| 0x4 | |||
| TextMemoryOffset | |||
|- | |||
| 0x18 | |||
| 0x4 | |||
| TextSize | |||
|- | |- | ||
| 0x1C | | 0x1C | ||
Line 35: | Line 43: | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
| | | 0x4 | ||
| | | RoFileOffset | ||
|- | |||
| 0x24 | |||
| 0x4 | |||
| RoMemoryOffset | |||
|- | |||
| 0x28 | |||
| 0x4 | |||
| RoSize | |||
|- | |- | ||
| 0x2C | | 0x2C | ||
Line 43: | Line 59: | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| | | 0x4 | ||
| | | DataFileOffset | ||
|- | |||
| 0x34 | |||
| 0x4 | |||
| DataMemoryOffset | |||
|- | |||
| 0x38 | |||
| 0x4 | |||
| DataSize | |||
|- | |- | ||
| 0x3C | | 0x3C | ||
Line 71: | Line 95: | ||
|- | |- | ||
| 0x88 | | 0x88 | ||
| | | 0x4 | ||
| | | EmbeddedOffset (relative to the .rodata section) | ||
|- | |||
| 0x8C | |||
| 0x4 | |||
| EmbeddedSize | |||
|- | |- | ||
| 0x90 | | 0x90 | ||
| | | 0x4 | ||
| | | DynStrOffset (relative to the .rodata section) | ||
|- | |||
| 0x94 | |||
| 0x4 | |||
| DynStrSize | |||
|- | |- | ||
| 0x98 | | 0x98 | ||
| | | 0x4 | ||
| | | DynSymOffset (relative to the .rodata section) | ||
|- | |||
| 0x9C | |||
| 0x4 | |||
| DynSymSize | |||
|- | |- | ||
| 0xA0 | | 0xA0 | ||
Line 98: | Line 134: | ||
| Compressed sections | | Compressed sections | ||
|} | |} | ||
== Flags == | == Flags == | ||
Line 127: | Line 160: | ||
|} | |} | ||
== | == ModuleId == | ||
This is "nn::ro::detail::ModuleId". | |||
Value of "build id" from ELF's GNU .note section. Contains variable sized digest, up to 32bytes. | Value of "build id" from ELF's GNU .note section. Contains variable sized digest, up to 32bytes. | ||
= Arguments = | = Arguments = | ||
[[Loader_services|Loader]] maps memory and writes the [[Loader_services#SetProgramArgument|arguments]] to {end of rwdata section | [[Loader_services|Loader]] maps memory and writes the [[Loader_services#SetProgramArgument|arguments]] to {end of rwdata section}. Official processes use argdata_addr = {page-aligned _end}. svcQueryMemory is used by official sw to verify that argdata_addr is mapped RW, since this memory is only mapped when arguments are specified via that command. Afterwards, official sw aligns the argdata_addr to 4-bytes. | ||
The structure located at argdata_addr is as follows: | The structure located at argdata_addr is as follows: |