NSO: Difference between revisions
		
		
		
		Jump to navigation
		Jump to search
		
|  Throw compression up on wiki | No edit summary | ||
| Line 1: | Line 1: | ||
| NSO is the main executable format. | NSO is the main executable format. | ||
| It starts with a  | It starts with the "NSO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers): | ||
| === SegmentHeader === | |||
| {| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
| |- | |- | ||
| Line 10: | Line 12: | ||
| | 0x0 | | 0x0 | ||
| | 4 | | 4 | ||
| |  | | file offset of data | ||
| |- | |- | ||
| | 0x4 | | 0x4 | ||
| | 4 | | 4 | ||
| |   | | memory offset loaded to | ||
| |- | |- | ||
| | 0x8 | | 0x8 | ||
| | 4 | | 4 | ||
| |   | | size of data copied to memory offset (i.e. size after decompression) | ||
| |- | |- | ||
| | 0xC | | 0xC | ||
| | 4 | | 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 | | 4 | ||
| |  | | offset (relative to .rodata) | ||
| |- | |- | ||
| |  | | 0x4 | ||
| | 4 | | 4 | ||
| |  | | size of region | ||
| |} | |||
| === NSO Header === | |||
| {| class="wikitable" border="1" | |||
| |- | |- | ||
| ! Offset | |||
| ! Size | |||
| ! Description | |||
| |- | |- | ||
| |  | | 0x0 | ||
| | 4 | | 4 | ||
| |  | | Magic "NSO0" | ||
| |- | |- | ||
| |  | | 0x4 | ||
| | 4 | | 4 | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x8 | ||
| | 4 | | 4 | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0xC | ||
| | 4 | | 4 | ||
| |  | |   | ||
| |- | |- | ||
| |  | | 0x10 | ||
| |  | | 0x10 * 3 | ||
| |  | | SegmentHeader for each segment | ||
| |- | |- | ||
| | 0x40 | | 0x40 | ||
| | 0x14 | | 0x14 | ||
| |  | | Value of "build id" from ELF's GNU .note section | ||
| |- | |- | ||
| | 0x54 | | 0x54 | ||
| Line 81: | Line 79: | ||
| |- | |- | ||
| | 0x60 | | 0x60 | ||
| |  | | 0x4 * 3 | ||
| | . | | file size of each segment (i.e. LZ4-compressed size) | ||
| |- | |||
| | 0x6c | |||
| | 0x24 | |||
| | Padding | |||
| |- | |||
| | 0x90 | |||
| | 8 | |||
| | .rodata-relative extents of .dynstr | |||
| |- | |||
| | 0x98 | |||
| | 8 | |||
| | .rodata-relative extents of .dynsym | |||
| |- | |- | ||
| | 0xA0 | | 0xA0 | ||
| |  | | 0x20 * 3 | ||
| | SHA256 hashes over the decompressed sections using the above byte-sizes: .text, .rodata, and .data. | | SHA256 hashes over the decompressed sections using the above byte-sizes: .text, .rodata, and .data. | ||
| |- | |- | ||
Revision as of 00:27, 2 July 2017
NSO is the main executable format.
It starts with the "NSO" header and mainly describes .text, .rodata, and .data segments (like a short-form of ELF program headers):
SegmentHeader
| 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
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 4 | offset (relative to .rodata) | 
| 0x4 | 4 | size of region | 
NSO Header
| Offset | Size | Description | 
|---|---|---|
| 0x0 | 4 | Magic "NSO0" | 
| 0x4 | 4 | |
| 0x8 | 4 | |
| 0xC | 4 | |
| 0x10 | 0x10 * 3 | SegmentHeader for each segment | 
| 0x40 | 0x14 | Value of "build id" from ELF's GNU .note section | 
| 0x54 | 0xC | Padding | 
| 0x60 | 0x4 * 3 | file size of each segment (i.e. LZ4-compressed size) | 
| 0x6c | 0x24 | Padding | 
| 0x90 | 8 | .rodata-relative extents of .dynstr | 
| 0x98 | 8 | .rodata-relative extents of .dynsym | 
| 0xA0 | 0x20 * 3 | SHA256 hashes over the decompressed sections using the above byte-sizes: .text, .rodata, and .data. | 
| 0x100 | Compressed sections |