From e6bc97979a9d323e8be03357d521235e2fd56746 Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Mon, 21 Jul 2025 11:53:04 -0400 Subject: [PATCH] Fix crash on R_MIPS_HI16 relocs caused by bad cast --- arch/mips/arch_mips.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/arch/mips/arch_mips.cpp b/arch/mips/arch_mips.cpp index 692679ecd..6150e5787 100644 --- a/arch/mips/arch_mips.cpp +++ b/arch/mips/arch_mips.cpp @@ -2727,10 +2727,6 @@ class MipsArchitecture: public Architecture return registers; } - - MipsVersion GetMIPSVersion() { - return m_version; - } }; class MipsO32CallingConvention: public CallingConvention @@ -3412,8 +3408,11 @@ class MipsElfRelocationHandler: public RelocationHandler uint32_t inst2 = *(uint32_t*)(cur->relocationDataCache); Instruction instruction; memset(&instruction, 0, sizeof(instruction)); - MipsArchitecture& march = dynamic_cast(*arch); - if (mips_decompose(&inst2, sizeof(uint32_t), &instruction, march.GetMIPSVersion(), cur->address, arch->GetEndianness(), DECOMPOSE_FLAGS_PSEUDO_OP)) + auto version = arch->GetAddressSize() == 8 ? MIPS_64 : MIPS_32; + if (Architecture::GetByName("r5900l") == arch) + version = MIPS_R5900; + if (mips_decompose(&inst2, sizeof(uint32_t), &instruction, + version, cur->address, arch->GetEndianness(), DECOMPOSE_FLAGS_PSEUDO_OP)) break; int32_t immediate = swap(inst2) & 0xffff;