From a6742d9cf7154937d4cc551b40157c1f41818e67 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Wed, 23 Nov 2016 04:03:13 +0900 Subject: [PATCH] ELF boot: scan segments for Wii mode detection, not sections --- Source/Core/Core/Boot/Boot_ELF.cpp | 8 ++++---- Source/Core/Core/Boot/ElfReader.h | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/Boot/Boot_ELF.cpp b/Source/Core/Core/Boot/Boot_ELF.cpp index 42ba5e2052..48efad678e 100644 --- a/Source/Core/Core/Boot/Boot_ELF.cpp +++ b/Source/Core/Core/Boot/Boot_ELF.cpp @@ -35,12 +35,12 @@ bool CBoot::IsElfWii(const std::string& filename) u32 HID4_mask = Common::swap32(0xfc1fffff); ElfReader reader(elf.get()); - for (int i = 0; i < reader.GetNumSections(); ++i) + for (int i = 0; i < reader.GetNumSegments(); ++i) { - if (reader.IsCodeSection(i)) + if (reader.IsCodeSegment(i)) { - u32* code = (u32*)reader.GetSectionDataPtr(i); - for (u32 j = 0; j < reader.GetSectionSize(i) / sizeof(u32); ++j) + u32* code = (u32*)reader.GetSegmentPtr(i); + for (u32 j = 0; j < reader.GetSegmentSize(i) / sizeof(u32); ++j) { if ((code[j] & HID4_mask) == HID4_pattern) return true; diff --git a/Source/Core/Core/Boot/ElfReader.h b/Source/Core/Core/Boot/ElfReader.h index b1d57d6aed..92392e2bc0 100644 --- a/Source/Core/Core/Boot/ElfReader.h +++ b/Source/Core/Core/Boot/ElfReader.h @@ -55,8 +55,9 @@ public: else return nullptr; } - bool IsCodeSection(int section) const { return sections[section].sh_type == SHT_PROGBITS; } + bool IsCodeSegment(int segment) const { return segments[segment].p_flags & PF_X; } const u8* GetSegmentPtr(int segment) { return GetPtr(segments[segment].p_offset); } + int GetSegmentSize(int segment) const { return segments[segment].p_filesz; } u32 GetSectionAddr(SectionID section) const { return sectionAddrs[section]; } int GetSectionSize(SectionID section) const { return sections[section].sh_size; } SectionID GetSectionByName(const char* name, int firstSection = 0) const; //-1 for not found