summaryrefslogtreecommitdiff
path: root/view
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2026-03-24 13:46:57 -0700
committerMark Rowe <mark@vector35.com>2026-03-30 13:22:34 -0700
commit0a356578e65cf54c5b654b59a509c2ebe29ab54b (patch)
tree36ddeae516b824e77e3369599ba796d9eef7f7a9 /view
parentddd7aa4e7cd5a1aa07a16c3895d1f91ebf49347b (diff)
[DSC] Process Objective-C metadata when loading view from .bndb
The processed Objective-C metadata is not saved to the .bdnb. It must be recomputed when the view is loaded. Fixes https://github.com/Vector35/binaryninja-api/issues/8030.
Diffstat (limited to 'view')
-rw-r--r--view/sharedcache/core/SharedCacheController.cpp24
-rw-r--r--view/sharedcache/core/SharedCacheController.h3
-rw-r--r--view/sharedcache/core/SharedCacheView.cpp8
-rw-r--r--view/sharedcache/core/SharedCacheView.h1
4 files changed, 36 insertions, 0 deletions
diff --git a/view/sharedcache/core/SharedCacheController.cpp b/view/sharedcache/core/SharedCacheController.cpp
index 8886748f..8ed011bd 100644
--- a/view/sharedcache/core/SharedCacheController.cpp
+++ b/view/sharedcache/core/SharedCacheController.cpp
@@ -292,3 +292,27 @@ void SharedCacheController::LoadMetadata(const Metadata& metadata)
m_loadedImages.insert(region);
}
}
+
+
+void SharedCacheController::ProcessObjCForLoadedImages(BinaryView& view)
+{
+ if (!m_processObjC || m_loadedImages.empty())
+ return;
+
+ for (const auto& headerAddress : m_loadedImages)
+ {
+ auto image = m_cache.GetImageAt(headerAddress);
+ if (!image)
+ continue;
+
+ auto objcProcessor = DSCObjC::SharedCacheObjCProcessor(&view, image->headerAddress);
+ try
+ {
+ objcProcessor.ProcessObjCData();
+ }
+ catch (std::exception& e)
+ {
+ m_logger->LogErrorForExceptionF(e, "Failed to restore ObjC metadata for image at {:#x}: {}", headerAddress, e.what());
+ }
+ }
+}
diff --git a/view/sharedcache/core/SharedCacheController.h b/view/sharedcache/core/SharedCacheController.h
index ff859321..c468bee5 100644
--- a/view/sharedcache/core/SharedCacheController.h
+++ b/view/sharedcache/core/SharedCacheController.h
@@ -63,5 +63,8 @@ namespace BinaryNinja::DSC {
Ref<Metadata> GetMetadata() const;
void LoadMetadata(const Metadata& metadata);
+
+ // Re-run the ObjC processor for loaded images to restore Objective-C metadata.
+ void ProcessObjCForLoadedImages(BinaryView& view);
};
} // namespace BinaryNinja::DSC
diff --git a/view/sharedcache/core/SharedCacheView.cpp b/view/sharedcache/core/SharedCacheView.cpp
index 746bd7eb..2f2ec9f2 100644
--- a/view/sharedcache/core/SharedCacheView.cpp
+++ b/view/sharedcache/core/SharedCacheView.cpp
@@ -981,6 +981,14 @@ bool SharedCacheView::InitController()
return true;
}
+
+void SharedCacheView::OnAfterSnapshotDataApplied()
+{
+ if (auto controller = SharedCacheController::FromView(*this))
+ controller->ProcessObjCForLoadedImages(*this);
+}
+
+
void SharedCacheView::SetPrimaryFileName(std::string primaryFileName)
{
m_primaryFileName = std::move(primaryFileName);
diff --git a/view/sharedcache/core/SharedCacheView.h b/view/sharedcache/core/SharedCacheView.h
index 5f916b30..ce592519 100644
--- a/view/sharedcache/core/SharedCacheView.h
+++ b/view/sharedcache/core/SharedCacheView.h
@@ -25,6 +25,7 @@ public:
~SharedCacheView() override = default;
bool Init() override;
+ void OnAfterSnapshotDataApplied() override;
// Initialized the shared cache controller for this view. This is what allows us to load images and regions.
bool InitController();