mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-06 16:59:03 +00:00
[makerom] Fix BSS duplication in ExeFS code, issue #20
This commit is contained in:
+14
-15
@@ -12,9 +12,8 @@ typedef struct code_segment
|
|||||||
{
|
{
|
||||||
u32 address;
|
u32 address;
|
||||||
u32 memSize;
|
u32 memSize;
|
||||||
|
u32 fileSize;
|
||||||
u32 pageNum;
|
u32 pageNum;
|
||||||
|
|
||||||
u32 size;
|
|
||||||
const u8 *data;
|
const u8 *data;
|
||||||
} code_segment;
|
} code_segment;
|
||||||
|
|
||||||
@@ -132,7 +131,7 @@ void CreateCodeSegmentFromElf(code_segment *out, elf_context *elf, u64 segment_f
|
|||||||
out->address = 0;
|
out->address = 0;
|
||||||
out->memSize = 0;
|
out->memSize = 0;
|
||||||
out->pageNum = 0;
|
out->pageNum = 0;
|
||||||
out->size = 0;
|
out->fileSize = 0;
|
||||||
out->data = NULL;
|
out->data = NULL;
|
||||||
|
|
||||||
/* Find segment */
|
/* Find segment */
|
||||||
@@ -147,8 +146,8 @@ void CreateCodeSegmentFromElf(code_segment *out, elf_context *elf, u64 segment_f
|
|||||||
if ((segments[i].flags & ~PF_CTRSDK) == segment_flags && segments[i].type == PT_LOAD) {
|
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->fileSize = segments[i].fileSize;
|
||||||
out->size = segments[i].fileSize;
|
out->pageNum = SizeToPage(out->fileSize);
|
||||||
out->data = segments[i].ptr;
|
out->data = segments[i].ptr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -167,23 +166,23 @@ int CreateExeFsCode(elf_context *elf, ncch_settings *set)
|
|||||||
CreateCodeSegmentFromElf(&rwdata, elf, PF_DATA);
|
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.fileSize) return NOT_FIND_TEXT_SEGMENT;
|
||||||
if (!rwdata.size) return NOT_FIND_DATA_SEGMENT;
|
if (!rwdata.fileSize) return NOT_FIND_DATA_SEGMENT;
|
||||||
|
|
||||||
/* Calculating BSS size */
|
/* Calculating BSS fileSize */
|
||||||
set->codeDetails.bssSize = rwdata.memSize - rwdata.size;
|
set->codeDetails.bssSize = rwdata.memSize - rwdata.fileSize;
|
||||||
|
|
||||||
/* Allocating Buffer for ExeFs Code */
|
/* Allocating Buffer for ExeFs Code */
|
||||||
u32 size = PageToSize(text.pageNum + rodata.pageNum + rwdata.pageNum);
|
u32 size = PageToSize(text.pageNum + rodata.pageNum + rwdata.pageNum);
|
||||||
u8 *code = calloc(1, size);
|
u8 *code = calloc(1, size);
|
||||||
|
|
||||||
/* Writing Code into Buffer */
|
/* Writing Code into Buffer */
|
||||||
u8 *textPos = (code + text.address - text.address);
|
u8 *textPos = (code + PageToSize(0));
|
||||||
u8 *rodataPos = (code + rodata.address - text.address);
|
u8 *rodataPos = (code + PageToSize(text.pageNum));
|
||||||
u8 *rwdataPos = (code + rwdata.address - text.address);
|
u8 *rwdataPos = (code + PageToSize(text.pageNum + rodata.pageNum));
|
||||||
if (text.size) memcpy(textPos, text.data, text.size);
|
if (text.fileSize) memcpy(textPos, text.data, text.fileSize);
|
||||||
if (rodata.size) memcpy(rodataPos, rodata.data, rodata.size);
|
if (rodata.fileSize) memcpy(rodataPos, rodata.data, rodata.fileSize);
|
||||||
if (rwdata.size) memcpy(rwdataPos, rwdata.data, rwdata.size);
|
if (rwdata.fileSize) memcpy(rwdataPos, rwdata.data, rwdata.fileSize);
|
||||||
|
|
||||||
|
|
||||||
/* Compressing if needed */
|
/* Compressing if needed */
|
||||||
|
|||||||
Reference in New Issue
Block a user