Loading...
--- dyld/dyld-1125.5/common/DyldSharedCache.cpp
+++ dyld/dyld-1235.2/common/DyldSharedCache.cpp
@@ -39,13 +39,14 @@
#include <unistd.h>
#include <dlfcn.h>
+#include "OptimizerSwift.h"
+
#if BUILDING_CACHE_BUILDER
#include <set>
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
-// #include "SharedCacheBuilder.h"
#include "FileUtils.h"
#endif
@@ -282,6 +283,66 @@
}
}
+void DyldSharedCache::forEachTPRORegion(void (^handler)(const void* content, uint64_t unslidVMAddr, uint64_t vmSize,
+ bool& stopRegion)) const
+{
+ if ( header.mappingOffset <= __offsetof(dyld_cache_header, tproMappingsCount) )
+ return;
+
+ uint64_t baseAddress = this->unslidLoadAddress();
+
+ const dyld_cache_tpro_mapping_info* mappings = (const dyld_cache_tpro_mapping_info*)((char*)this + header.tproMappingsOffset);
+ const dyld_cache_tpro_mapping_info* mappingsEnd = &mappings[header.tproMappingsCount];
+ for (const dyld_cache_tpro_mapping_info* m = mappings; m < mappingsEnd; ++m) {
+ bool stop = false;
+ uint64_t offsetInCache = m->unslidAddress - baseAddress;
+ handler((char*)this + (long)offsetInCache, m->unslidAddress, m->size, stop);
+ if ( stop )
+ return;
+ }
+}
+
+const char* DyldSharedCache::mappingName(uint32_t maxProt, uint64_t flags)
+{
+ const char* mappingName = "";
+ if ( maxProt & VM_PROT_EXECUTE ) {
+ if ( flags & DYLD_CACHE_MAPPING_TEXT_STUBS ) {
+ mappingName = "__TEXT_STUBS";
+ } else {
+ mappingName = "__TEXT";
+ }
+ } else if ( maxProt & VM_PROT_WRITE ) {
+ if ( flags & DYLD_CACHE_MAPPING_AUTH_DATA ) {
+ if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
+ mappingName = "__AUTH_DIRTY";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_TPRO_DATA )
+ mappingName = "__AUTH_TPRO_CONST";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
+ mappingName = "__AUTH_CONST";
+ else
+ mappingName = "__AUTH";
+ } else {
+ if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
+ mappingName = "__DATA_DIRTY";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_TPRO_DATA )
+ mappingName = "__TPRO_CONST";
+ else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
+ mappingName = "__DATA_CONST";
+ else
+ mappingName = "__DATA";
+ }
+ }
+ else if ( maxProt & VM_PROT_READ ) {
+ if ( flags & DYLD_CACHE_READ_ONLY_DATA )
+ mappingName = "__READ_ONLY";
+ else
+ mappingName = "__LINKEDIT";
+ } else {
+ mappingName = "*unknown*";
+ }
+ return mappingName;
+}
+
void DyldSharedCache::forEachRange(void (^handler)(const char* mappingName,
uint64_t unslidVMAddr, uint64_t vmSize,
uint32_t cacheFileIndex, uint64_t fileOffset,
@@ -293,35 +354,7 @@
forEachCache(^(const DyldSharedCache *cache, bool& stopCache) {
cache->forEachRegion(^(const void *content, uint64_t unslidVMAddr, uint64_t size,
uint32_t initProt, uint32_t maxProt, uint64_t flags, bool& stopRegion) {
- const char* mappingName = "";
- if ( maxProt & VM_PROT_EXECUTE ) {
- if ( flags & DYLD_CACHE_MAPPING_TEXT_STUBS ) {
- mappingName = "__TEXT_STUBS";
- } else {
- mappingName = "__TEXT";
- }
- } else if ( maxProt & VM_PROT_WRITE ) {
- if ( flags & DYLD_CACHE_MAPPING_AUTH_DATA ) {
- if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
- mappingName = "__AUTH_DIRTY";
- else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
- mappingName = "__AUTH_CONST";
- else
- mappingName = "__AUTH";
- } else {
- if ( flags & DYLD_CACHE_MAPPING_DIRTY_DATA )
- mappingName = "__DATA_DIRTY";
- else if ( flags & DYLD_CACHE_MAPPING_CONST_DATA )
- mappingName = "__DATA_CONST";
- else
- mappingName = "__DATA";
- }
- }
- else if ( maxProt & VM_PROT_READ ) {
- mappingName = "__LINKEDIT";
- } else {
- mappingName = "*unknown*";
- }
+ const char* mappingName = DyldSharedCache::mappingName(maxProt, flags);
uint64_t fileOffset = (uint8_t*)content - (uint8_t*)cache;
bool stop = false;
handler(mappingName, unslidVMAddr, size, cacheFileIndex, fileOffset, initProt, maxProt, stop);
@@ -1596,6 +1629,9 @@
assert(slideInfo->delta_mask == 0x00000000C0000000);
pointerFormat = VMAddrConverter::SharedCacheFormat::v4;
pointerValueAdd = slideInfo->value_add;
+ } else if ( slideInfoHeader->version == 5 ) {
+ pointerFormat = VMAddrConverter::SharedCacheFormat::v5;
+ pointerValueAdd = unslidLoadAddress();
} else {
assert(false);
}
@@ -2057,7 +2093,8 @@
if ( header.swiftOptsOffset == 0 )
return nullptr;
- return (SwiftOptimizationHeader*)((char*)this + header.swiftOptsOffset);
+ SwiftOptimizationHeader* optHeader = (SwiftOptimizationHeader*)((char*)this + header.swiftOptsOffset);
+ return optHeader;
}
std::pair<const void*, uint64_t> DyldSharedCache::getObjCConstantRange() const