summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2018-05-12 20:59:22 -0400
committerPeter LaFosse <peter@vector35.com>2018-05-12 20:59:22 -0400
commitbcbf41603888f03beff805415982cc1d9623e2c1 (patch)
tree241763f311ee38d4f6860a896544ee2b00e9986e
parenta7524ae957f62fded3991152a360c553c99639b6 (diff)
Add support for symbolic relocations
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h3
-rw-r--r--binaryview.cpp24
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());