Loading...
--- dyld/dyld-360.22/launch-cache/dsc_iterator.cpp
+++ dyld/dyld-640.2/launch-cache/dsc_iterator.cpp
@@ -33,7 +33,7 @@
#include "Architectures.hpp"
#include "MachOFileAbstraction.hpp"
#include "CacheFileAbstraction.hpp"
-
+#include "SupportedArchs.h"
namespace dyld {
@@ -59,7 +59,7 @@
// call the callback block on each segment in this image
template <typename A>
- int walkSegments(const uint8_t* cache, const uint8_t* cacheEnd, const uint8_t* firstSeg, const char* dylibPath, uint64_t inode,uint64_t modTime, const uint8_t* machHeader,
+ int walkSegments(const uint8_t* cache, const uint8_t* cacheEnd, const uint8_t* firstSeg, const char* dylibPath, uint64_t inode,uint64_t modTime, const uint8_t* machHeader, uint64_t cache_unslid_base_address,
void (^callback)(const dyld_shared_cache_dylib_info* dylibInfo, const dyld_shared_cache_segment_info* segInfo))
{
typedef typename A::P P;
@@ -104,13 +104,14 @@
if ( (fileOffset+sizem) > (uint64_t)(cacheEnd-cache) )
sizem = (cacheEnd-cache)-fileOffset;
}
- segInfo.version = 1;
+ segInfo.version = 2;
segInfo.name = segCmd->segname();
segInfo.fileOffset = fileOffset;
segInfo.fileSize = sizem;
if ( segCmd->filesize() > segCmd->vmsize() )
return -1;
segInfo.address = segCmd->vmaddr();
+ segInfo.addressOffset = segInfo.address - cache_unslid_base_address;
callback(&dylibInfo, &segInfo);
}
cmd = (const macho_load_command<P>*)(((uint8_t*)cmd)+cmd->cmdsize());
@@ -131,6 +132,7 @@
const dyldCacheHeader<E>* header = (dyldCacheHeader<E>*)cache;
const dyldCacheImageInfo<E>* dylibs = (dyldCacheImageInfo<E>*)&cache[header->imagesOffset()];
const dyldCacheFileMapping<E>* mappings = (dyldCacheFileMapping<E>*)&cache[header->mappingOffset()];
+ uint64_t unslid_base_address = mappings[0].address();
uint64_t greatestMappingOffset = 0;
for (uint32_t i=0; i < header->mappingCount(); ++i) {
if ( (size != 0) && (mappings[i].file_offset() > size) )
@@ -168,7 +170,7 @@
return -1;
if ( firstSeg == NULL )
firstSeg = machHeader;
- int result = walkSegments<A>(cache, cacheEnd, firstSeg, dylibPath, inode, modTime, machHeader, callback);
+ int result = walkSegments<A>(cache, cacheEnd, firstSeg, dylibPath, inode, modTime, machHeader, unslid_base_address, callback);
if ( result != 0 )
return result;
}
@@ -201,6 +203,14 @@
return dyld::walkImages<arm>(cache, shared_cache_size, callback);
else if ( strcmp((char*)cache, "dyld_v1 arm64") == 0 )
return dyld::walkImages<arm64>(cache, shared_cache_size, callback);
+#if SUPPORT_ARCH_arm64_32
+ else if ( strcmp((char*)cache, "dyld_v1arm64_32") == 0 )
+ return dyld::walkImages<arm64_32>(cache, shared_cache_size, callback);
+#endif
+#if SUPPORT_ARCH_arm64e
+ else if ( strcmp((char*)cache, "dyld_v1 arm64e") == 0 )
+ return dyld::walkImages<arm64>(cache, shared_cache_size, callback);
+#endif
else
return -1;
}