diff options
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 102 |
1 files changed, 100 insertions, 2 deletions
diff --git a/architecture.cpp b/architecture.cpp index a1aaca2d..ea27d805 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -140,8 +140,8 @@ BNArchitecture* Architecture::GetAssociatedArchitectureByAddressCallback(void* c } -bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, - size_t maxLen, BNInstructionInfo* result) +bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, + BNInstructionInfo* result) { Architecture* arch = (Architecture*)ctxt; @@ -152,6 +152,19 @@ bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, u } +bool Architecture::GetRelocationInfoCallback(void* ctxt, BNBinaryView* view, uint64_t relocType, + BNRelocationInfo* result) +{ + Architecture* arch = (Architecture*)ctxt; + + BNRelocationInfo info = *result; + Ref<BinaryView> bv = new BinaryView(BNNewViewReference(view)); + bool ok = arch->GetRelocationInfo(bv, relocType, info); + *result = info; + return ok; +} + + bool Architecture::GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len, BNInstructionTextToken** result, size_t* count) { @@ -640,6 +653,33 @@ bool Architecture::SkipAndReturnValueCallback(void* ctxt, uint8_t* data, uint64_ } +// bool Architecture::ApplyPERelocationCallback(void* ctxt, BNBinaryView* view, BNRelocation* rel, uint8_t* data, size_t len) +// { +// Architecture* arch = (Architecture*)ctxt; +// Ref<BinaryView> bv = new BinaryView(BNNewViewReference(view)); +// Ref<Relocation> reloc = new Relocation(BNNewRelocationReference(rel)); +// return arch->ApplyPERelocation(bv, reloc, data, len); +// } + + +bool Architecture::ApplyELFRelocationCallback(void* ctxt, BNBinaryView* view, BNRelocationInfo* rel, uint8_t* data, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + Ref<BinaryView> bv = new BinaryView(BNNewViewReference(view)); + BNRelocationInfo reloc = *rel; + return arch->ApplyELFRelocation(bv, reloc, data, len); +} + + +// bool Architecture::ApplyMachoRelocationCallback(void* ctxt, BNBinaryView* view, BNRelocation* rel, uint8_t* data, size_t len) +// { +// Architecture* arch = (Architecture*)ctxt; +// Ref<BinaryView> bv = new BinaryView(BNNewViewReference(view)); +// Ref<Relocation> reloc = new Relocation(BNNewRelocationReference(rel)); +// return arch->ApplyMachoRelocation(bv, reloc, data, len); +// } + + void Architecture::Register(BNCustomArchitecture* callbacks) { AddRefForRegistration(); @@ -708,6 +748,10 @@ void Architecture::Register(Architecture* arch) callbacks.alwaysBranch = AlwaysBranchCallback; callbacks.invertBranch = InvertBranchCallback; callbacks.skipAndReturnValue = SkipAndReturnValueCallback; + // callbacks.applyPERelocation = ApplyPERelocationCallback; + callbacks.applyELFRelocation = ApplyELFRelocationCallback; + // callbacks.applyMachoRelocation = ApplyMachoRelocationCallback; + callbacks.getRelocationInfo = GetRelocationInfoCallback; arch->Register(&callbacks); } @@ -1234,6 +1278,37 @@ Ref<Platform> Architecture::GetStandalonePlatform() } +// bool Architecture::ApplyPERelocation(BinaryView* view, Relocation* rel, uint8_t* dest, size_t len) +// { +// (void)view; +// (void)rel; +// (void)dest; +// (void)len; +// return true; +// } + + +bool Architecture::ApplyELFRelocation(BinaryView* view, BNRelocationInfo& rel, uint8_t* dest, size_t len) +{ + (void)view; + (void)rel; + (void)dest; + (void)len; + + return true; +} + + +// bool Architecture::ApplyMachoRelocation(BinaryView* view, Relocation* rel, uint8_t* dest, size_t len) +// { +// (void)view; +// (void)rel; +// (void)dest; +// (void)len; +// return true; +// } + + void Architecture::AddArchitectureRedirection(Architecture* from, Architecture* to) { BNAddArchitectureRedirection(m_object, from->GetObject(), to->GetObject()); @@ -1726,6 +1801,29 @@ bool CoreArchitecture::SkipAndReturnValue(uint8_t* data, uint64_t addr, size_t l } +// bool CoreArchitecture::ApplyPERelocation(BinaryView* view, Relocation* rel, uint8_t* dest, size_t len) +// { +// return BNArchitectureApplyPERelocation(m_object, view->GetObject(), rel->GetObject(), dest, len); +// } + + +bool CoreArchitecture::ApplyELFRelocation(BinaryView* view, BNRelocationInfo& rel, uint8_t* dest, size_t len) +{ + return BNArchitectureApplyELFRelocation(m_object, view->GetObject(), &rel, dest, len); +} + + +// bool CoreArchitecture::ApplyMachoRelocation(BinaryView* view, Relocation* rel, uint8_t* dest, size_t len) +// { +// return BNArchitectureApplyMachoRelocation(m_object, view->GetObject(), rel->GetObject(), dest, len); +// } + + +bool CoreArchitecture::GetRelocationInfo(BinaryView* view, uint64_t relocType, BNRelocationInfo& reloc) +{ + return BNGetRelocationInfo(m_object, view->GetObject(), relocType, &reloc); +} + ArchitectureExtension::ArchitectureExtension(const string& name, Architecture* base): Architecture(name), m_base(base) { } |
