Loading...
--- dyld/dyld-960/cache-builder/CachePatching.h
+++ dyld/dyld-1125.5/cache-builder/CachePatching.h
@@ -106,8 +106,11 @@
struct dyld_cache_image_export_v2
{
uint32_t dylibOffsetOfImpl; // Offset from the dylib we used to find a dyld_cache_image_patches_v2
- uint32_t exportNameOffset;
+ uint32_t exportNameOffset : 28;
+ uint32_t patchKind : 4; // One of DyldSharedCache::patchKind
};
+
+static_assert(sizeof(dyld_cache_image_export_v2) == 8, "Wrong size");
struct dyld_cache_image_clients_v2
{
@@ -141,5 +144,51 @@
}
};
+//
+// MARK: --- V3 patching. This is V2 plus support for GOT combining ---
+//
+struct dyld_cache_patch_info_v3 : dyld_cache_patch_info_v2
+{
+ // uint32_t patchTableVersion; // == 3
+ // ... other fields from dyld_cache_patch_info_v2
+ uint64_t gotClientsArrayAddr; // (unslid) address of array for dyld_cache_image_got_clients_v3 for each image
+ uint64_t gotClientsArrayCount; // count of got clients entries. Should always match the patchTableArrayCount
+ uint64_t gotClientExportsArrayAddr; // (unslid) address of array for patch exports for each GOT image
+ uint64_t gotClientExportsArrayCount; // count of patch exports entries
+ uint64_t gotLocationArrayAddr; // (unslid) address of array for patch locations for each GOT patch
+ uint64_t gotLocationArrayCount; // count of patch location entries
+};
+
+struct dyld_cache_image_got_clients_v3
+{
+ uint32_t patchExportsStartIndex; // Points to dyld_cache_patchable_export_v3[]
+ uint32_t patchExportsCount;
+};
+
+struct dyld_cache_patchable_export_v3
+{
+ uint32_t imageExportIndex; // Points to dyld_cache_image_export_v2
+ uint32_t patchLocationsStartIndex; // Points to dyld_cache_patchable_location_v3[]
+ uint32_t patchLocationsCount;
+};
+
+struct dyld_cache_patchable_location_v3
+{
+ uint64_t cacheOffsetOfUse; // Offset from the cache header
+ uint32_t high7 : 7,
+ addend : 5, // 0..31
+ authenticated : 1,
+ usesAddressDiversity : 1,
+ key : 2,
+ discriminator : 16;
+
+ uint64_t getAddend() const {
+ uint64_t unsingedAddend = addend;
+ int64_t signedAddend = (int64_t)unsingedAddend;
+ signedAddend = (signedAddend << 52) >> 52;
+ return (uint64_t)signedAddend;
+ }
+};
+
#endif /* _CACHE_PATCHING_H_ */