Loading...
cache_builder/Optimizers.cpp dyld-1066.8 dyld-1335
--- dyld/dyld-1066.8/cache_builder/Optimizers.cpp
+++ dyld/dyld-1335/cache_builder/Optimizers.cpp
@@ -31,7 +31,7 @@
 // MARK: --- StubOptimizer methods ---
 //
 
-// These are functions that are interposed by Instruments.app or ASan
+// These are functions that are interposed by Instruments.app or ASan or libRPAC.dylib
 const char* const neverStubEliminateSymbols[] = {
     "___bzero",
     "___cxa_atexit",
@@ -54,6 +54,9 @@
     "_cp_drawable_present",
     "_cp_drawable_encode_present",
     "_cp_drawable_enqueue_present",
+    "_CGImageDestinationFinalize",
+    "_CGImageSourceCreateThumbnailAtIndex",
+    "_CGImageSourceCreateImageAtIndex",
     "_ctime",
     "_ctime_r",
     "_dispatch_after",
@@ -68,6 +71,7 @@
     "_dispatch_sync_f",
     "_dlclose",
     "_dlopen",
+    "_dlsym",
     "_dup",
     "_dup2",
     "_endgrent",
@@ -166,6 +170,7 @@
     "_modf",
     "_modff",
     "_modfl",
+    "_mprotect",
     "_munlock",
     "_munlockall",
     "_objc_autoreleasePoolPop",
@@ -245,6 +250,25 @@
     "_sigwait",
     "_snprintf",
     "_sprintf",
+    "_sqlite3_close",
+    "_sqlite3_close_v2",
+    "_sqlite3_exec",
+    "_sqlite3_exec_b",
+    "_sqlite3_finalize",
+    "_sqlite3_open",
+    "_sqlite3_open16",
+    "_sqlite3_open_v2",
+    "_sqlite3_prepare",
+    "_sqlite3_prepare16",
+    "_sqlite3_prepare16_v2",
+    "_sqlite3_prepare16_v3",
+    "_sqlite3_prepare_v2",
+    "_sqlite3_prepare_v3",
+    "_sqlite3_step",
+    "_sqlite3_wal_autocheckpoint",
+    "_sqlite3_wal_checkpoint",
+    "_sqlite3_wal_checkpoint_v2",
+    "_sqlite3_wal_hook",
     "_sscanf",
     "_stat",
     "_statfs",
@@ -298,12 +322,24 @@
     "_write",
     "_writev",
     "_writev$UNIX2003",
+    "___pwrite_nocancel",
+    "___pwritev_nocancel",
+    "___write_nocancel",
+    "___writev_nocancel",
+    "_pwrite$NOCANCEL",
+    "_pwritev$NOCANCEL",
+    "_write$NOCANCEL",
+    "_writev$NOCANCEL",
     "_xpc_connection_send_message_with_reply_sync",
+    "__dyld_register_func_for_add_image",
+    "__dyld_register_func_for_remove_image",
     // <rdar://problem/22050956> always use stubs for C++ symbols that can be overridden
     "__ZdaPv",
     "__ZdlPv",
     "__Znam",
     "__Znwm",
+    "__ZnwmSt19__type_descriptor_t",
+    "__ZnamSt19__type_descriptor_t",
 
     nullptr
 };
@@ -337,11 +373,14 @@
     return (stubVMAddr & (-4096)) + adrpValue*4096 + ldrValue*8;
 }
 
-void StubOptimizer::generateArm64StubTo(uint8_t* stubBuffer,
-                                        uint64_t stubVMAddr, uint64_t targetVMAddr)
+void StubOptimizer::generateArm64StubTo(uint8_t* stubBuffer, uint64_t stubVMAddr,
+                                         uint64_t gotVMAddr, uint64_t targetVMAddr)
 {
     int64_t adrpDelta = (targetVMAddr & -4096) - (stubVMAddr & -4096);
-
+    if ( std::abs(adrpDelta) > 0xFFFFE000 ) {
+        generateArm64StubToGOT(stubBuffer, stubVMAddr, gotVMAddr);
+        return;
+    }
     uint32_t immhi   = (adrpDelta >> 9) & (0x00FFFFE0);
     uint32_t immlo   = (adrpDelta << 17) & (0x60000000);
     uint32_t newADRP = (0x90000010) | immlo | immhi;
@@ -355,14 +394,14 @@
 }
 
 void StubOptimizer::generateArm64StubToGOT(uint8_t* stubBuffer,
-                                           uint64_t stubVMAddr, uint64_t targetVMAddr)
-{
-    int64_t adrpDelta = (targetVMAddr & -4096) - (stubVMAddr & -4096);
+                                           uint64_t stubVMAddr, uint64_t gotVMAddr)
+{
+    int64_t adrpDelta = (gotVMAddr & -4096) - (stubVMAddr & -4096);
 
     uint32_t immhi   = (adrpDelta >> 9) & (0x00FFFFE0);
     uint32_t immlo   = (adrpDelta << 17) & (0x60000000);
     uint32_t newADRP = (0x90000010) | immlo | immhi;
-    uint32_t off12   = (targetVMAddr & 0xFFF) >> 3;
+    uint32_t off12   = (gotVMAddr & 0xFFF) >> 3;
     uint32_t newLDR  = (0xF9400210) | (off12 << 10);
 
     uint32_t* stubInstructions = (uint32_t*)stubBuffer;
@@ -412,14 +451,14 @@
 }
 
 void StubOptimizer::generateArm64_32StubToGOT(uint8_t* stubBuffer,
-                                              uint64_t stubVMAddr, uint64_t targetVMAddr)
-{
-    int64_t adrpDelta = (targetVMAddr & -4096) - (stubVMAddr & -4096);
+                                              uint64_t stubVMAddr, uint64_t gotVMAddr)
+{
+    int64_t adrpDelta = (gotVMAddr & -4096) - (stubVMAddr & -4096);
 
     uint32_t immhi   = (adrpDelta >> 9) & (0x00FFFFE0);
     uint32_t immlo   = (adrpDelta << 17) & (0x60000000);
     uint32_t newADRP = (0x90000010) | immlo | immhi;
-    uint32_t off12   = (targetVMAddr & 0xFFF) >> 2;
+    uint32_t off12   = (gotVMAddr & 0xFFF) >> 2;
     uint32_t newLDR  = (0xB9400210) | (off12 << 10);
 
     uint32_t* stubInstructions = (uint32_t*)stubBuffer;
@@ -461,11 +500,14 @@
     return (stubVMAddr & (-4096)) + adrpValue*4096 + addValue;
 }
 
-void StubOptimizer::generateArm64eStubTo(uint8_t* stubBuffer,
-                                         uint64_t stubVMAddr, uint64_t targetVMAddr)
+void StubOptimizer::generateArm64eStubTo(uint8_t* stubBuffer, uint64_t stubVMAddr,
+                                         uint64_t gotVMAddr, uint64_t targetVMAddr)
 {
     int64_t adrpDelta = (targetVMAddr & -4096) - (stubVMAddr & -4096);
-
+    if ( std::abs(adrpDelta) > 0xFFFFE000 ) {
+        generateArm64eStubToGOT(stubBuffer, stubVMAddr, gotVMAddr);
+        return;
+    }
     uint32_t immhi   = (adrpDelta >> 9) & (0x00FFFFE0);
     uint32_t immlo   = (adrpDelta << 17) & (0x60000000);
     uint32_t newADRP = (0x90000010) | immlo | immhi;
@@ -480,14 +522,14 @@
 }
 
 void StubOptimizer::generateArm64eStubToGOT(uint8_t* stubBuffer,
-                                            uint64_t stubVMAddr, uint64_t targetVMAddr)
-{
-    int64_t adrpDelta = (targetVMAddr & -4096) - (stubVMAddr & -4096);
+                                            uint64_t stubVMAddr, uint64_t gotVMAddr)
+{
+    int64_t adrpDelta = (gotVMAddr & -4096) - (stubVMAddr & -4096);
 
     uint32_t immhi   = (adrpDelta >> 9) & (0x00FFFFE0);
     uint32_t immlo   = (adrpDelta << 17) & (0x60000000);
     uint32_t newADRP = (0x90000011) | immlo | immhi;
-    uint32_t off12   = (targetVMAddr & 0xFFF);
+    uint32_t off12   = (gotVMAddr & 0xFFF);
     uint32_t newADD  = (0x91000231) | (off12 << 10);
 
     uint32_t* stubInstructions = (uint32_t*)stubBuffer;
@@ -496,3 +538,14 @@
     stubInstructions[2] = 0xF9400230;  // LDR   X16, [X17]
     stubInstructions[3] = 0xD71F0A11;  // BRAA  X16, X17
 }
+
+//
+// MARK: --- UniquedGOTsOptimizer methods ---
+//
+void UniquedGOTsOptimizer::forEachFunctionVariant(void (^callback)(const CoalescedGOTSection::FunctionVariantInfo& tv, uint64_t gotVMAddr,
+                                                                   dyld3::MachOFile::PointerMetaData pmd)) const
+{
+    this->regularGOTs.forEachFunctionVariant(callback);
+    this->authGOTs.forEachFunctionVariant(callback);
+    this->authPtrs.forEachFunctionVariant(callback);
+}