Loading...
--- dyld/dyld-851.27/dyld3/SharedCacheRuntime.cpp
+++ dyld/dyld-832.7.3/dyld3/SharedCacheRuntime.cpp
@@ -59,8 +59,6 @@
#ifndef VM_PROT_NOAUTH
#define VM_PROT_NOAUTH 0x40 /* must not interfere with normal prot assignments */
#endif
-
-extern bool gEnableSharedCacheDataConst;
namespace dyld {
extern void log(const char*, ...);
@@ -338,8 +336,8 @@
{
for (int i=0; i < mappingsCount; ++i) {
const char* mappingName = "";
- if ( mappings[i].sms_max_prot & VM_PROT_WRITE ) {
- if ( mappings[i].sms_max_prot & VM_PROT_NOAUTH ) {
+ if ( mappings[i].sms_init_prot & VM_PROT_WRITE ) {
+ if ( mappings[i].sms_init_prot & VM_PROT_NOAUTH ) {
// __DATA*
mappingName = "data";
} else {
@@ -356,33 +354,6 @@
((mappings[i].sms_init_prot & VM_PROT_WRITE) ? "write " : ""),
((mappings[i].sms_init_prot & VM_PROT_EXECUTE) ? "execute " : ""),
mappingName);
- }
-}
-
-
-static void verboseSharedCacheMappingsToConsole(const shared_file_mapping_slide_np mappings[DyldSharedCache::MaxMappings],
- uint32_t mappingsCount)
-{
- for (int i=0; i < mappingsCount; ++i) {
- const char* mappingName = "";
- if ( mappings[i].sms_max_prot & VM_PROT_WRITE ) {
- if ( mappings[i].sms_max_prot & VM_PROT_NOAUTH ) {
- // __DATA*
- mappingName = "data";
- } else {
- // __AUTH*
- mappingName = "auth";
- }
- }
- uint32_t init_prot = mappings[i].sms_init_prot & (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
- uint32_t max_prot = mappings[i].sms_max_prot & (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
- dyld::logToConsole("dyld: mapping 0x%08llX->0x%08llX init=%x, max=%x %s%s%s%s\n",
- mappings[i].sms_address, mappings[i].sms_address+mappings[i].sms_size-1,
- init_prot, max_prot,
- ((mappings[i].sms_init_prot & VM_PROT_READ) ? "read " : ""),
- ((mappings[i].sms_init_prot & VM_PROT_WRITE) ? "write " : ""),
- ((mappings[i].sms_init_prot & VM_PROT_EXECUTE) ? "execute " : ""),
- mappingName);
}
}
#endif
@@ -501,7 +472,6 @@
uint64_t slideInfoFileOffset = 0;
uint64_t slideInfoFileSize = 0;
vm_prot_t authProt = 0;
- vm_prot_t initProt = fileMappings[i].initProt;
if ( cache->header.mappingOffset <= __offsetof(dyld_cache_header, mappingWithSlideOffset) ) {
// Old cache without the new slid mappings
if ( i == 1 ) {
@@ -518,12 +488,6 @@
slideInfoFileSize = slidableMappings[i].slideInfoFileSize;
if ( (slidableMappings[i].flags & DYLD_CACHE_MAPPING_AUTH_DATA) == 0 )
authProt = VM_PROT_NOAUTH;
- if ( (slidableMappings[i].flags & DYLD_CACHE_MAPPING_CONST_DATA) != 0 ) {
- // The cache was built with __DATA_CONST being read-only. We can override that
- // with a boot-arg
- if ( !gEnableSharedCacheDataConst )
- initProt |= VM_PROT_WRITE;
- }
}
// Add a file for each mapping
@@ -534,7 +498,7 @@
info->mappings[i].sms_slide_size = 0;
info->mappings[i].sms_slide_start = 0;
info->mappings[i].sms_max_prot = fileMappings[i].maxProt;
- info->mappings[i].sms_init_prot = initProt;
+ info->mappings[i].sms_init_prot = fileMappings[i].initProt;
if ( slideInfoFileSize != 0 ) {
uint64_t offsetInLinkEditRegion = (slideInfoFileOffset - linkeditMapping->fileOffset);
info->mappings[i].sms_slide_start = (user_addr_t)(linkeditMapping->address + offsetInLinkEditRegion);
@@ -678,15 +642,16 @@
// we don't know the path this cache was previously loaded from, assume default
getCachePath(options, sizeof(results->path), results->path);
if ( options.verbose ) {
- const dyld_cache_mapping_and_slide_info* const mappings = (const dyld_cache_mapping_and_slide_info*)(cacheBaseAddress + existingCache->header.mappingWithSlideOffset);
+ const shared_file_mapping_np* const mappings = (shared_file_mapping_np*)(cacheBaseAddress + existingCache->header.mappingOffset);
dyld::log("re-using existing shared cache (%s):\n", results->path);
shared_file_mapping_slide_np slidMappings[DyldSharedCache::MaxMappings];
for (int i=0; i < DyldSharedCache::MaxMappings; ++i) {
- slidMappings[i].sms_address = mappings[i].address;
- slidMappings[i].sms_size = mappings[i].size;
- slidMappings[i].sms_file_offset = mappings[i].fileOffset;
- slidMappings[i].sms_max_prot = mappings[i].maxProt;
- slidMappings[i].sms_init_prot = mappings[i].initProt;
+ slidMappings[i].sms_address = mappings[i].sfm_address;
+ slidMappings[i].sms_size = mappings[i].sfm_size;
+ slidMappings[i].sms_file_offset = mappings[i].sfm_file_offset;
+ slidMappings[i].sms_max_prot = mappings[i].sfm_max_prot;
+ slidMappings[i].sms_init_prot = mappings[i].sfm_init_prot;
+
slidMappings[i].sms_address += results->slide;
if ( existingCache->header.mappingOffset > __offsetof(dyld_cache_header, mappingWithSlideOffset) ) {
// New caches have slide info on each new mapping
@@ -696,12 +661,6 @@
slidMappings[i].sms_max_prot |= VM_PROT_NOAUTH;
slidMappings[i].sms_init_prot |= VM_PROT_NOAUTH;
}
- if ( (slidableMappings[i].flags & DYLD_CACHE_MAPPING_CONST_DATA) != 0 ) {
- // The cache was built with __DATA_CONST being read-only. We can override that
- // with a boot-arg
- if ( !gEnableSharedCacheDataConst )
- slidMappings[i].sms_init_prot |= VM_PROT_WRITE;
- }
}
}
verboseSharedCacheMappings(slidMappings, existingCache->header.mappingCount);
@@ -710,7 +669,6 @@
else {
results->errorMessage = "existing shared cache in memory is not compatible";
}
-
return true;
}
return false;
@@ -792,22 +750,10 @@
results->loadAddress = (const DyldSharedCache*)(info.mappings[0].sms_address);
if ( info.mappingsCount != 3 ) {
// We don't know our own slide any more as the kernel owns it, so ask for it again now
- if ( reuseExistingCache(options, results) ) {
-
- // update mappings based on the slide the kernel chose
- for (uint32_t i=0; i < info.mappingsCount; ++i) {
- info.mappings[i].sms_address += results->slide;
- if ( info.mappings[i].sms_slide_size != 0 )
- info.mappings[i].sms_slide_start += (uint32_t)results->slide;
- }
-
- if ( options.verbose )
- verboseSharedCacheMappingsToConsole(info.mappings, info.mappingsCount);
+ if ( reuseExistingCache(options, results) )
return true;
- }
// Uh oh, we mapped the kernel, but we didn't find the slide
- if ( options.verbose )
- dyld::logToConsole("dyld: error finding shared cache slide for system wide mapping\n");
+ dyld::logToConsole("dyld: error finding shared cache slide for system wide mapping\n");
return false;
}
}
@@ -890,10 +836,6 @@
#if TARGET_OS_SIMULATOR // simulator caches do not support sliding
return true;
#else
-
- // Change __DATA_CONST to read-write for this block
- DyldSharedCache::DataConstScopedWriter patcher(results->loadAddress, mach_task_self(), options.verbose ? &dyld::log : nullptr);
-
__block bool success = true;
for (int i=0; i < info.mappingsCount; ++i) {
if ( info.mappings[i].sms_slide_size == 0 )