From 28bd09568392b4ee60a3d25b08b39e2f2563b080 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 14 Oct 2024 12:00:11 -0700 Subject: [PATCH] elf2nro: add support for aligned header flag --- src/elf2nro.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/elf2nro.c b/src/elf2nro.c index 2b6c9e8..7d5bd06 100644 --- a/src/elf2nro.c +++ b/src/elf2nro.c @@ -21,9 +21,9 @@ typedef struct { typedef struct { u8 Magic[4]; - u32 Unk1; + u32 version; u32 size; - u32 Unk2; + u32 flags; NsoSegment Segments[3]; u32 bssSize; u32 Unk3; @@ -78,9 +78,10 @@ int main(int argc, char* argv[]) { fprintf(stderr, "--nacp= Embeds control.nacp into the output file.\n"); fprintf(stderr, "--romfs= Embeds RomFS into the output file.\n"); fprintf(stderr, "--romfsdir= Builds and embeds RomFS into the output file.\n"); + fprintf(stderr, "--alignedheader Sets the \"AlignedHeader\" flag in the output file.\n"); return EXIT_FAILURE; } - + NroStart nro_start; memset(&nro_start, 0, sizeof(nro_start)); @@ -102,18 +103,20 @@ int main(int argc, char* argv[]) { int argi; char* icon_path = NULL, *nacp_path = NULL, *romfs_path = NULL, *romfs_dir_path = NULL; + u32 aligned_header = 0; for (argi=3; argip_filesz + 0xFFF) & ~0xFFF; @@ -174,13 +177,13 @@ int main(int argc, char* argv[]) { fprintf(stderr, "Out of memory!\n"); return EXIT_FAILURE; } - + memcpy(buf[i], &elf[phdr->p_offset], phdr->p_filesz); file_off += nro_hdr.Segments[i].Size; file_off = (file_off + 0xFFF) & ~0xFFF; } - + /* Iterate over sections to find build id. */ size_t cur_sect_hdr_ofs = hdr->e_shoff; for (unsigned int i = 0; i < hdr->e_shnum; i++) { @@ -206,9 +209,12 @@ int main(int argc, char* argv[]) { fprintf(stderr, "Failed to open output file!\n"); return EXIT_FAILURE; } - + nro_hdr.size = file_off; + nro_hdr.version = 0; + nro_hdr.flags = (aligned_header << 0); + // TODO check retvals for (i=0; i<3; i++) @@ -270,7 +276,7 @@ int main(int argc, char* argv[]) { asset_hdr.romfs.offset = tmp_off; asset_hdr.romfs.size = romfs_len; tmp_off+= romfs_len; - + } else if (romfs_dir_path) { asset_hdr.romfs.offset = tmp_off; asset_hdr.romfs.size = build_romfs_by_path_into_file(romfs_dir_path, out, file_off + tmp_off);