Loading...
--- dyld/dyld-1066.8/cache_builder/Optimizers.cpp
+++ dyld/dyld-1330/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);
+}