diff options
| author | Mason Reed <mason@vector35.com> | 2025-04-28 18:28:26 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-28 18:28:31 -0400 |
| commit | 8267ab475cb2ac82fd3724c009f21e8e30143f6b (patch) | |
| tree | cb3f759c3b9659b077b090ce66d402a43b9fede9 /view/sharedcache/core/SharedCache.cpp | |
| parent | 4b04f93ad0161bef8434300a153aed4f5ec100f9 (diff) | |
[SharedCache] Improve support for older shared cache versions
Fixed branch island regions being skipped
Diffstat (limited to 'view/sharedcache/core/SharedCache.cpp')
| -rw-r--r-- | view/sharedcache/core/SharedCache.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp index 66c737d0..e4689086 100644 --- a/view/sharedcache/core/SharedCache.cpp +++ b/view/sharedcache/core/SharedCache.cpp @@ -325,15 +325,16 @@ void SharedCache::ProcessEntryRegions(const CacheEntry& entry) // Collect pool addresses as non image memory regions. for (size_t i = 0; i < entryHeader.branchPoolsCount; i++) { - auto branchPoolAddr = entryHeader.branchPoolsOffset + (i * m_vm->GetAddressSize()); - auto header = SharedCacheMachOHeader::ParseHeaderForAddress( - m_vm, branchPoolAddr, "dyld_shared_cache_branch_islands_" + std::to_string(i)); + auto branchPoolIdxAddr = *entry.GetMappedAddress(entryHeader.branchPoolsOffset) + (i * m_vm->GetAddressSize()); + auto branchPoolAddr = m_vm->ReadPointer(branchPoolIdxAddr); + auto branchHeader = SharedCacheMachOHeader::ParseHeaderForAddress( + m_vm, branchPoolAddr, fmt::format("dyld_shared_cache_branch_islands_{}", i)); // Stop processing branch pools if a header fails to parse. - if (!header.has_value()) + if (!branchHeader.has_value()) break; // Gather all non image regions from the branch islands. - for (const auto& segment : header->segments) + for (const auto& segment : branchHeader->segments) { CacheRegion stubIslandRegion; stubIslandRegion.start = segment.vmaddr; |
