mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-06-06 01:02:08 +00:00
Fix import thunk resolving.
This commit is contained in:
parent
918e09d380
commit
510cff56f2
@ -1765,7 +1765,7 @@ bool Recompiler::Recompile(const Function& fn)
|
|||||||
if (insn.opcode == nullptr)
|
if (insn.opcode == nullptr)
|
||||||
{
|
{
|
||||||
println("\t// {}", insn.op_str);
|
println("\t// {}", insn.op_str);
|
||||||
#if 0
|
#if 1
|
||||||
if (*(data - 1) != 0)
|
if (*(data - 1) != 0)
|
||||||
std::println("Unable to decode instruction {:X} at {:X}", *(data - 1), base - 4);
|
std::println("Unable to decode instruction {:X} at {:X}", *(data - 1), base - 4);
|
||||||
#endif
|
#endif
|
||||||
|
@ -163,6 +163,11 @@ void SWARecompiler::Analyse()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (*(uint32_t*)data == 0x45564800)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
auto fnSymbol = image.symbols.find(base);
|
auto fnSymbol = image.symbols.find(base);
|
||||||
if (fnSymbol != image.symbols.end() && fnSymbol->address == base && fnSymbol->type == Symbol_Function)
|
if (fnSymbol != image.symbols.end() && fnSymbol->address == base && fnSymbol->type == Symbol_Function)
|
||||||
{
|
{
|
||||||
|
@ -11,7 +11,7 @@ void Image::Map(const std::string_view& name, size_t base, uint32_t size, uint8_
|
|||||||
|
|
||||||
const void* Image::Find(size_t address) const
|
const void* Image::Find(size_t address) const
|
||||||
{
|
{
|
||||||
const auto section = sections.find(address);
|
const auto section = sections.lower_bound(address);
|
||||||
if (section == sections.end())
|
if (section == sections.end())
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -39,7 +39,7 @@ struct SectionComparer
|
|||||||
|
|
||||||
bool operator()(const Section& lhs, size_t rhs) const
|
bool operator()(const Section& lhs, size_t rhs) const
|
||||||
{
|
{
|
||||||
return rhs > lhs.base + lhs.size;
|
return lhs.base < rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator()(size_t lhs, const Section& rhs) const
|
bool operator()(size_t lhs, const Section& rhs) const
|
||||||
@ -49,6 +49,6 @@ struct SectionComparer
|
|||||||
|
|
||||||
bool operator()(const Section& lhs, const Section& rhs) const
|
bool operator()(const Section& lhs, const Section& rhs) const
|
||||||
{
|
{
|
||||||
return (lhs.base + lhs.size) < rhs.base;
|
return lhs.base < rhs.base;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -101,12 +101,13 @@ Image Xex2LoadImage(const uint8_t* data)
|
|||||||
auto originalThunk = (XEX_THUNK_DATA*)image.Find(descriptors[im].FirstThunk);
|
auto originalThunk = (XEX_THUNK_DATA*)image.Find(descriptors[im].FirstThunk);
|
||||||
auto thunkType = originalThunk->Function >> 24;
|
auto thunkType = originalThunk->Function >> 24;
|
||||||
|
|
||||||
if (thunkType == 1)
|
if (thunkType != 0)
|
||||||
{
|
{
|
||||||
uint32_t thunk[4] = { 0x00000060, 0x00000060, 0x00000060, 0x2000804E };
|
uint32_t thunk[4] = { 0x00000060, 0x00000060, 0x00000060, 0x2000804E };
|
||||||
memcpy(originalThunk, thunk, sizeof(thunk));
|
memcpy(originalThunk, thunk, sizeof(thunk));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
library = (XEX_IMPORT_LIBRARY*)((char*)(library + 1) + library->NumberOfImports * sizeof(XEX_IMPORT_DESCRIPTOR));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user