diff options
| author | Peter LaFosse <peter@vector35.com> | 2018-05-12 20:59:22 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2018-05-12 20:59:22 -0400 |
| commit | bcbf41603888f03beff805415982cc1d9623e2c1 (patch) | |
| tree | 241763f311ee38d4f6860a896544ee2b00e9986e | |
| parent | a7524ae957f62fded3991152a360c553c99639b6 (diff) | |
Add support for symbolic relocations
| -rw-r--r-- | binaryninjaapi.h | 3 | ||||
| -rw-r--r-- | binaryninjacore.h | 3 | ||||
| -rw-r--r-- | binaryview.cpp | 24 |
3 files changed, 30 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 54e98ad5..e52a3a16 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1124,6 +1124,7 @@ namespace BinaryNinja virtual bool PerformSave(FileAccessor* file); void PerformDefineRelocation(Architecture* arch, BNRelocationInfo& info, uint64_t target, uint64_t reloc); + void PerformDefineRelocation(Architecture* arch, BNRelocationInfo& info, Ref<Symbol> sym, uint64_t reloc); void NotifyDataWritten(uint64_t offset, size_t len); void NotifyDataInserted(uint64_t offset, size_t len); void NotifyDataRemoved(uint64_t offset, uint64_t len); @@ -1151,6 +1152,7 @@ namespace BinaryNinja static size_t GetAddressSizeCallback(void* ctxt); static bool SaveCallback(void* ctxt, BNFileAccessor* file); static void DefineRelocationCallback(void* ctxt, BNArchitecture* arch, BNRelocationInfo* info, uint64_t target, uint64_t reloc); + static void DefineSymbolRelocationCallback(void* ctxt, BNArchitecture* arch, BNRelocationInfo* info, BNSymbol* target, uint64_t reloc); public: BinaryView(BNBinaryView* view); @@ -1224,6 +1226,7 @@ namespace BinaryNinja bool Save(const std::string& path); void DefineRelocation(Architecture* arch, BNRelocationInfo& info, uint64_t target, uint64_t reloc); + void DefineRelocation(Architecture* arch, BNRelocationInfo& info, Ref<Symbol> target, uint64_t reloc); void RegisterNotification(BinaryDataNotification* notify); void UnregisterNotification(BinaryDataNotification* notify); diff --git a/binaryninjacore.h b/binaryninjacore.h index f3b34a1d..73ccbd4d 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -1053,6 +1053,7 @@ extern "C" size_t (*getAddressSize)(void* ctxt); bool (*save)(void* ctxt, BNFileAccessor* accessor); void (*defineRelocation) (void* ctxt, BNArchitecture* arch, BNRelocationInfo* info, uint64_t target, uint64_t reloc); + void (*defineSymbolRelocation) (void* ctxt, BNArchitecture* arch, BNRelocationInfo* info, BNSymbol* target, uint64_t reloc); }; struct BNCustomBinaryViewType @@ -1993,6 +1994,8 @@ extern "C" BINARYNINJACOREAPI bool BNSaveToFilename(BNBinaryView* view, const char* filename); BINARYNINJACOREAPI void BNDefineRelocation(BNBinaryView* view, BNArchitecture* arch, BNRelocationInfo* info, uint64_t target, uint64_t reloc); + BINARYNINJACOREAPI void BNDefineSymbolRelocation(BNBinaryView* view, BNArchitecture* arch, BNRelocationInfo* info, + BNSymbol* target, uint64_t reloc); BINARYNINJACOREAPI void BNRegisterDataNotification(BNBinaryView* view, BNBinaryDataNotification* notify); BINARYNINJACOREAPI void BNUnregisterDataNotification(BNBinaryView* view, BNBinaryDataNotification* notify); diff --git a/binaryview.cpp b/binaryview.cpp index 6c4418b8..03821071 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -449,6 +449,7 @@ BinaryView::BinaryView(const std::string& typeName, FileMetadata* file, BinaryVi view.getAddressSize = GetAddressSizeCallback; view.save = SaveCallback; view.defineRelocation = DefineRelocationCallback; + view.defineSymbolRelocation = DefineSymbolRelocationCallback; m_file = file; AddRefForRegistration(); m_object = BNCreateCustomBinaryView(typeName.c_str(), m_file->GetObject(), @@ -621,6 +622,17 @@ void BinaryView::DefineRelocationCallback(void* ctxt, BNArchitecture* arch, BNRe } +void BinaryView::DefineSymbolRelocationCallback(void* ctxt, BNArchitecture* arch, BNRelocationInfo* info, BNSymbol* sym, + uint64_t reloc) +{ + BinaryView* view = (BinaryView*)ctxt; + BNRelocationInfo curInfo = *info; + Architecture* curArch = new CoreArchitecture(arch); + Ref<Symbol> curSymbol = new Symbol(sym); + return view->PerformDefineRelocation(curArch, curInfo, curSymbol, reloc); +} + + bool BinaryView::PerformIsValidOffset(uint64_t offset) { uint8_t val; @@ -700,6 +712,12 @@ void BinaryView::PerformDefineRelocation(Architecture* arch, BNRelocationInfo& i } +void BinaryView::PerformDefineRelocation(Architecture* arch, BNRelocationInfo& info, Ref<Symbol> target, uint64_t reloc) +{ + DefineRelocation(arch, info, target, reloc); +} + + void BinaryView::NotifyDataWritten(uint64_t offset, size_t len) { BNNotifyDataWritten(m_object, offset, len); @@ -885,6 +903,12 @@ void BinaryView::DefineRelocation(Architecture* arch, BNRelocationInfo& info, ui } +void BinaryView::DefineRelocation(Architecture* arch, BNRelocationInfo& info, Ref<Symbol> target, uint64_t reloc) +{ + BNDefineSymbolRelocation(m_object, arch->GetObject(), &info, target->GetObject(), reloc); +} + + void BinaryView::RegisterNotification(BinaryDataNotification* notify) { BNRegisterDataNotification(m_object, notify->GetCallbacks()); |
