NRO: Difference between revisions
No edit summary |
No edit summary |
||
(8 intermediate revisions by 3 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 | |||
| Signature ("NRO0") | |||
|- | |||
| 0x14 | |||
| 0x4 | |||
| Version | |||
|- | |||
| 0x18 | |||
| 0x4 | | 0x4 | ||
| | | Size (total NRO file size) | ||
|- | |- | ||
| 0x1C | |||
| 0x4 | | 0x4 | ||
| Flags | |||
|- | |||
| 0x20 | |||
| 0x4 | | 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 | ||
| | | DsoHandleOffset | ||
|- | |- | ||
| | | 0x64 | ||
| 0x4 | | 0x4 | ||
| | | Reserved | ||
|- | |- | ||
| | | 0x68 | ||
| | | 0x4 | ||
| | | EmbeddedOffset | ||
|- | |- | ||
| | | 0x6C | ||
| 0x4 | | 0x4 | ||
| | | EmbeddedSize | ||
|- | |- | ||
| | | 0x70 | ||
| 0x4 | | 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 80: | 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 109: | Line 146: | ||
|- | |- | ||
| 0x8 | | 0x8 | ||
| | | 0x10 | ||
| AssetSection icon. Used by the Homebrew Launcher. Like official icons, this is a 256x256 JPEG. | | AssetSection icon. Used by the Homebrew Launcher. Like official icons, this is a 256x256 JPEG. | ||
|- | |- | ||
| 0x18 | |||
| 0x10 | | 0x10 | ||
| AssetSection [[NACP_Format|NACP]]. Used by the Homebrew Launcher. | |||
| AssetSection [[ | |||
|- | |- | ||
| | | 0x28 | ||
| | | 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" | ||
|- | |- | ||
Line 130: | Line 166: | ||
|- | |- | ||
| 0x0 | | 0x0 | ||
| | | 0x8 | ||
| Offset | | Offset | ||
|- | |- | ||
| | | 0x8 | ||
| | | 0x8 | ||
| Size | | Size, 0 indicates this section is empty. | ||
|} | |} |