diff options
| author | Scott Mansell <phiren@gmail.com> | 2026-07-29 18:12:24 +1200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-29 18:12:24 +1200 |
| commit | e9317dbe48860dfaf6122b077fa9e812176f2a00 (patch) | |
| tree | b2f9dffd04203b803bd9b393efd9cc33b94009c2 /Source | |
| parent | a7345f8bdec3d40e7ec76adbc91c8fe5d25747e9 (diff) | |
| parent | b2a57f43915a4dfbde4ab7ca38afbed90dc2edf9 (diff) | |
Merge pull request #14115 from techflashYT/elf-loader-fix
Core/Boot: Fix ELF load address semantics
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Core/Boot/ElfReader.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/Source/Core/Core/Boot/ElfReader.cpp b/Source/Core/Core/Boot/ElfReader.cpp index 8cdc1770a5..1e570c9e9d 100644 --- a/Source/Core/Core/Boot/ElfReader.cpp +++ b/Source/Core/Core/Boot/ElfReader.cpp @@ -195,17 +195,23 @@ bool ElfReader::LoadIntoMemory(Core::System& system, bool only_in_mem1) const { Elf32_Phdr* p = segments + i; - INFO_LOG_FMT(BOOT, "Type: {} Vaddr: {:08x} Filesz: {} Memsz: {}", p->p_type, p->p_vaddr, - p->p_filesz, p->p_memsz); + INFO_LOG_FMT(BOOT, "Type: {} Vaddr: {:08x} Paddr: {:08x} Filesz: {} Memsz: {}", p->p_type, + p->p_vaddr, p->p_paddr, p->p_filesz, p->p_memsz); if (p->p_type == PT_LOAD) { - u32 writeAddr = p->p_vaddr; + // Check LMA (paddr) first - some are nonsense, so fall back to VMA (vaddr) if invalid + u32 writeAddr = p->p_paddr; + if (writeAddr) + writeAddr |= 0x80000000; // map to virtual address + else + writeAddr = p->p_vaddr; // LMA is empty, fall back to VMA + const u8* src = GetSegmentPtr(i); u32 srcSize = p->p_filesz; u32 dstSize = p->p_memsz; - if (only_in_mem1 && p->p_vaddr >= memory.GetRamSizeReal()) + if (only_in_mem1 && writeAddr >= memory.GetRamSizeReal()) continue; memory.CopyToEmu(writeAddr, src, srcSize); |
