summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/SharedCache.h
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2025-09-13 16:17:43 -0700
committerMark Rowe <mark@vector35.com>2025-09-17 20:45:26 -0700
commite937b89628f3b3ce039d641fe849796cc295c41a (patch)
tree0cf7e14946c65d1ca818483f18ea4d77a46aa786 /view/sharedcache/core/SharedCache.h
parent11dc8b216d0852c83ff5c9bfd7d3ca146a93fe84 (diff)
[DSC] Rework handling of .symbols files to be compatible with iOS 15
In some iOS 15 caches, the .symbols file's mapping has an address of 0. This would cause it to be returned by `SharedCache::GetEntryContaining` and loaded into the view. The .symbols file contains the local symbol tables for images in the shared cache. It is not intended to be mapped into the same address space as the rest of the shared cache. `SharedCache` now tracks the symbols cache entry separately from other entries. A dedicated `VirtualMemory` region is used when accessing the data it contains. This could be a `FileAccessor`, but that would require additional changes within `SharedCacheMachOHeader`. `SharedCacheMachOProcessor` now directly accesses the local symbols cache entry rather than needing to search for it.
Diffstat (limited to 'view/sharedcache/core/SharedCache.h')
-rw-r--r--view/sharedcache/core/SharedCache.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/view/sharedcache/core/SharedCache.h b/view/sharedcache/core/SharedCache.h
index efef394c..58f1f38c 100644
--- a/view/sharedcache/core/SharedCache.h
+++ b/view/sharedcache/core/SharedCache.h
@@ -188,6 +188,11 @@ class SharedCache
// NOTE: Wrapped in unique_ptr to keep SharedCache movable.
std::unique_ptr<std::shared_mutex> m_namedSymMutex;
+ // Local symbols entry and its mapping, used to read symbol tables from the .symbols file.
+ // These are handled separately as they are not mapped into the main virtual memory of the cache.
+ std::optional<CacheEntry> m_localSymbolsEntry;
+ std::shared_ptr<VirtualMemory> m_localSymbolsVM;
+
bool ProcessEntryImage(const std::string& path, const dyld_cache_image_info& info);
// Add a region known not to overlap with another, otherwise use AddRegion.
@@ -211,6 +216,9 @@ public:
const std::unordered_map<uint64_t, CacheImage>& GetImages() const { return m_images; }
const std::unordered_map<uint64_t, CacheSymbol>& GetSymbols() const { return m_symbols; }
+ const std::optional<CacheEntry>& GetLocalSymbolsEntry() const { return m_localSymbolsEntry; }
+ std::shared_ptr<VirtualMemory> GetLocalSymbolsVM() const { return m_localSymbolsVM; }
+
void AddImage(CacheImage&& image);
// Add a region that may overlap with another.