Difference between revisions of "NSO"
Jump to navigation
Jump to search
(Throw compression up on wiki) |
|||
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 23:27, 1 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 |