summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/SharedCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'view/sharedcache/core/SharedCache.cpp')
-rw-r--r--view/sharedcache/core/SharedCache.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp
index 0a14cfaf..c084c692 100644
--- a/view/sharedcache/core/SharedCache.cpp
+++ b/view/sharedcache/core/SharedCache.cpp
@@ -91,10 +91,8 @@ CacheEntry CacheEntry::FromFile(const std::string& filePath, const std::string&
{
// We found a single symbols cache entry file. Mark it as such!
type = CacheEntryType::Symbols;
- // Adjust the mapping for the symbol file, they seem to be only for the header.
- // If we do not adjust the mapping than we will not be able to read the symbol table through the virtual memory.
- mappings[0].fileOffset = 0;
- mappings[0].size = file->Length();
+ // Symbol files are not mapped into the address space.
+ mappings.clear();
}
else if (mappings.size() == 1 && header.imagesCountOld == 0 && header.imagesCount == 0
&& header.imagesTextOffset == 0)
@@ -231,6 +229,17 @@ void SharedCache::AddEntry(CacheEntry entry)
// Get the file accessor to associate with the virtual memory region.
auto fileAccessor = FileAccessorCache::Global().Open(entry.GetFilePath());
+ if (entry.GetType() == CacheEntryType::Symbols)
+ {
+ m_localSymbolsEntry = std::move(entry);
+ // Map the entire file into its own virtual memory space.
+ // This is necessary due to code that processes symbols being written in terms of a `VirtualMemory`
+ // rather than something more generic.
+ m_localSymbolsVM = std::make_shared<VirtualMemory>(m_vm->GetAddressSize());
+ m_localSymbolsVM->MapRegion(fileAccessor, {0, fileAccessor.lock()->Length()}, 0);
+ return;
+ }
+
// Populate virtual memory using the entry mappings, by doing so we can now
// read the memory of the mapped regions of the cache entry file.
const auto& mappings = entry.GetMappings();