NRO: Difference between revisions
No edit summary |
No edit summary |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
NRO is the executable format for non-[[ExeFS]] binaries. | NRO is the executable format for non-[[ExeFS]] binaries. | ||
It starts with the NRO-start structure then the "NRO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers): | It starts with the NRO-start structure then the "NRO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers). | ||
= NroHeader = | |||
This is "nn::ro::detail::NroHeader". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 12: | Line 13: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| 0x10 | |||
| [[#RocrtHeader|Rocrt]] | |||
|- | |||
| 0x10 | |||
| 0x4 | | 0x4 | ||
| | | Signature ("NRO0") | ||
|- | |- | ||
| 0x14 | |||
| 0x4 | | 0x4 | ||
| Version | |||
|- | |||
| 0x18 | |||
| 0x4 | | 0x4 | ||
| | | Size (total NRO file size) | ||
|- | |- | ||
| | | 0x1C | ||
| | | 0x4 | ||
| | | Flags | ||
| | |- | ||
| 0x20 | |||
| 0x4 | |||
| TextMemoryOffset | |||
|- | |||
| 0x24 | |||
| 0x4 | |||
| TextSize | |||
|- | |||
| 0x28 | |||
| 0x4 | |||
| RoMemoryOffset | |||
|- | |||
| 0x2C | |||
| 0x4 | |||
| RoSize | |||
|- | |- | ||
| 0x30 | |||
| 0x4 | |||
| DataMemoryOffset | |||
|- | |- | ||
| | | 0x34 | ||
| 0x4 | | 0x4 | ||
| | | DataSize | ||
|- | |- | ||
| 0x38 | |||
| 0x4 | | 0x4 | ||
| BssSize | |||
|- | |||
| 0x3C | |||
| 0x4 | | 0x4 | ||
| | | Reserved | ||
|- | |- | ||
| | | 0x40 | ||
| | | 0x20 | ||
| | | [[#ModuleId|ModuleId]] | ||
|- | |- | ||
| | | 0x60 | ||
| 0x4 | | 0x4 | ||
| | | DsoHandleOffset | ||
|- | |- | ||
| | | 0x64 | ||
| | | 0x4 | ||
| | | Reserved | ||
|- | |- | ||
| | | 0x68 | ||
| 0x4 | | 0x4 | ||
| | | EmbeddedOffset | ||
|- | |- | ||
| | | 0x6C | ||
| 0x4 | | 0x4 | ||
| | | EmbeddedSize | ||
|- | |- | ||
| | | 0x70 | ||
| | | 0x4 | ||
| | | DynStrOffset | ||
|- | |- | ||
| | | 0x74 | ||
| | | 0x4 | ||
| | | DynStrSize | ||
|- | |- | ||
| | | 0x78 | ||
| | | 0x4 | ||
| | | DynSymOffset | ||
|- | |- | ||
| 0x7C | |||
| 0x4 | |||
| DynSymSize | |||
|} | |} | ||
== | == RocrtHeader == | ||
This is "nn::ro::detail::RocrtHeader". | |||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 81: | Line 111: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| | | [17.0.0+] 0xC ([1.0.0-16.1.0] 0x8) | ||
| | | [[MOD#ModuleHeaderLocation|ModuleHeaderLocation]] | ||
|- | |- | ||
| 0xC | |||
| 0x4 | | 0x4 | ||
| | | Reserved | ||
|} | |} | ||
=Assets= | == ModuleId == | ||
This is "nn::ro::detail::ModuleId". | |||
Value of "build id" from ELF's GNU .note section. Contains variable sized digest, up to 32bytes. | |||
= Homebrew = | |||
== Assets == | |||
This is an optional custom assets section for homebrew, this is located at file offset {NroHeader.size}. See also [https://github.com/switchbrew/switch-tools switch-tools] for implementation. | This is an optional custom assets section for homebrew, this is located at file offset {NroHeader.size}. See also [https://github.com/switchbrew/switch-tools switch-tools] for implementation. | ||
The below offsets are relative to the beginning of the assets section (AssetHeader). | The below offsets are relative to the beginning of the assets section (AssetHeader). | ||
== AssetHeader == | === AssetHeader === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 120: | Line 156: | ||
| 0x10 | | 0x10 | ||
| AssetSection romfs. Can be used by the application. | | AssetSection romfs. Can be used by the application. | ||
|} | |} | ||
== AssetSection == | === AssetSection === | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- |