[makerom] misc

This commit is contained in:
jakcron
2015-12-17 20:36:34 +08:00
parent 83d4a1fcf3
commit 59c5df9d8c
+16 -21
View File
@@ -123,39 +123,36 @@ int ImportPlainRegionFromElf(elf_context *elf, ncch_settings *set)
return 0; return 0;
} }
int CreateCodeSegmentFromElf(code_segment *out, elf_context *elf, u64 segment_flags) void CreateCodeSegmentFromElf(code_segment *out, elf_context *elf, u64 segment_flags)
{ {
u32 segmentNum = elf_SegmentNum(elf); u32 segmentNum = elf_SegmentNum(elf);
const elf_segment *segments = elf_GetSegments(elf); const elf_segment *segments = elf_GetSegments(elf);
/* Initialise struct data */
out->address = 0;
out->memSize = 0;
out->pageNum = 0;
out->size = 0;
out->data = NULL;
/* Find segment */ /* Find segment */
for (u16 i = 0; i < segmentNum; i++) { for (u16 i = 0; i < segmentNum; i++) {
/* Skip SDK ELF plain region /* Skip SDK ELF .module_id segment
The last segment should always be data in valid ELFs, The last segment should always be data in valid ELFs,
unless this is an SDK ELF with .module_id segment */ unless this is an SDK ELF with .module_id segment */
if (i == segmentNum-1 && segments[i].flags == PF_RODATA) if (i == segmentNum-1 && segments[i].flags == PF_RODATA)
continue; continue;
/* Found segment */ /* Found segment */
if ((segments[i].flags & ~PF_CTRSDK) == segment_flags) { if ((segments[i].flags & ~PF_CTRSDK) == segment_flags && segments[i].type == PT_LOAD) {
out->address = segments[i].vAddr; out->address = segments[i].vAddr;
out->memSize = segments[i].memSize; out->memSize = segments[i].memSize;
out->pageNum = SizeToPage(out->memSize); out->pageNum = SizeToPage(out->memSize);
out->size = segments[i].fileSize; out->size = segments[i].fileSize;
out->data = malloc(out->size); out->data = segments[i].ptr;
if (!out->data) { fprintf(stderr, "[CODE ERROR] Not enough memory\n"); return MEM_ERROR; } break;
memcpy(out->data, segments[i].ptr, out->size);
return 0;
} }
} }
/* Stub struct data */
out->address = 0;
out->memSize = 0;
out->pageNum = 0;
out->size = 0;
out->data = NULL;
return 0;
} }
int CreateExeFsCode(elf_context *elf, ncch_settings *set) int CreateExeFsCode(elf_context *elf, ncch_settings *set)
@@ -165,14 +162,15 @@ int CreateExeFsCode(elf_context *elf, ncch_settings *set)
code_segment rodata; code_segment rodata;
code_segment rwdata; code_segment rwdata;
if (CreateCodeSegmentFromElf(&text, elf, PF_TEXT) == MEM_ERROR || CreateCodeSegmentFromElf(&rodata, elf, PF_RODATA) == MEM_ERROR || CreateCodeSegmentFromElf(&rwdata, elf, PF_DATA) == MEM_ERROR) CreateCodeSegmentFromElf(&text, elf, PF_TEXT);
return MEM_ERROR; CreateCodeSegmentFromElf(&rodata, elf, PF_RODATA);
CreateCodeSegmentFromElf(&rwdata, elf, PF_DATA);
/* Checking the existence of essential ELF Segments */ /* Checking the existence of essential ELF Segments */
if (!text.size) return NOT_FIND_TEXT_SEGMENT; if (!text.size) return NOT_FIND_TEXT_SEGMENT;
if (!rwdata.size) return NOT_FIND_DATA_SEGMENT; if (!rwdata.size) return NOT_FIND_DATA_SEGMENT;
/* Calculateing BSS size */ /* Calculating BSS size */
set->codeDetails.bssSize = rwdata.memSize - rwdata.size; set->codeDetails.bssSize = rwdata.memSize - rwdata.size;
/* Allocating Buffer for ExeFs Code */ /* Allocating Buffer for ExeFs Code */
@@ -208,17 +206,14 @@ int CreateExeFsCode(elf_context *elf, ncch_settings *set)
set->codeDetails.textAddress = text.address; set->codeDetails.textAddress = text.address;
set->codeDetails.textMaxPages = text.pageNum; set->codeDetails.textMaxPages = text.pageNum;
set->codeDetails.textSize = text.memSize; set->codeDetails.textSize = text.memSize;
if (text.size) free(text.data);
set->codeDetails.roAddress = rodata.address; set->codeDetails.roAddress = rodata.address;
set->codeDetails.roMaxPages = rodata.pageNum; set->codeDetails.roMaxPages = rodata.pageNum;
set->codeDetails.roSize = rodata.memSize; set->codeDetails.roSize = rodata.memSize;
if (rodata.size) free(rodata.data);
set->codeDetails.rwAddress = rwdata.address; set->codeDetails.rwAddress = rwdata.address;
set->codeDetails.rwMaxPages = rwdata.pageNum; set->codeDetails.rwMaxPages = rwdata.pageNum;
set->codeDetails.rwSize = rwdata.memSize; set->codeDetails.rwSize = rwdata.memSize;
if (rwdata.size) free(rwdata.data);
if (set->rsfSet->SystemControlInfo.StackSize) if (set->rsfSet->SystemControlInfo.StackSize)
set->codeDetails.stackSize = strtoul(set->rsfSet->SystemControlInfo.StackSize, NULL, 0); set->codeDetails.stackSize = strtoul(set->rsfSet->SystemControlInfo.StackSize, NULL, 0);