Loading...
libdyld/libdyldGlue.cpp dyld-1340 dyld-960
--- dyld/dyld-1340/libdyld/libdyldGlue.cpp
+++ dyld/dyld-960/libdyld/libdyldGlue.cpp
@@ -22,49 +22,94 @@
  */
 
 
-#include <TargetConditionals.h>
-#if TARGET_OS_EXCLAVEKIT
-  #include <liblibc/liblibc.h>
-  extern void abort_report_np(const char* format, ...) __attribute__((noreturn,format(printf, 1, 2)));
-#else
-  #include <libc_private.h>
-  #include <sys/errno.h>
-  #include <sys/mman.h>
-  #include <sys/stat.h>
-  #include <_simple.h>
-#endif
-
 #include <string.h>
 #include <stdint.h>
-
-
+#include <sys/errno.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
 #include <TargetConditionals.h>
+#include <_simple.h>
 #include <mach-o/dyld_priv.h>
 #include <malloc/malloc.h>
 #include <mach-o/dyld.h>
 #include <mach-o/dyld_priv.h>
 #include <dlfcn.h>
 #include <dlfcn_private.h>
-
+#include <libc_private.h>
 #include <ptrauth.h>
 #include <pthread.h>
 
 #include "DyldProcessConfig.h"
-#include "DyldRuntimeState.h"
 #include "DyldAPIs.h"
-#include "ThreadLocalVariables.h"
-
+
+using dyld4::gDyld;
+
+
+// implemented in assembly
+extern "C" void* tlv_get_addr(dyld3::MachOAnalyzer::TLV_Thunk*);
+
+// called from threadLocalHelpers.s
+extern "C" void* instantiateTLVs_thunk(pthread_key_t key);
+VIS_HIDDEN
+void* instantiateTLVs_thunk(pthread_key_t key)
+{
+    // Called by _tlv_get_addr on slow path to allocate thread
+    // local storge for the current thread.
+    return gDyld.apis->_instantiateTLVs(key);
+}
+
+#if SUPPPORT_PRE_LC_MAIN
+// called by crt before main() by programs linked with 10.4 or earlier crt1.o
+static void _dyld_make_delayed_module_initializer_calls()
+{
+    // We don't actually do anything here, we just need the function to exist
+    // If we had a very old binary AND a custom entry point we would have to do something, but dyld has not supported that on x86_64 in years.
+    // Instead just return an empty function and let initializers run normally
+    gDyld.apis->runAllInitializersForMain();
+}
+#endif
+
+// Used to support legacy binaries that have __DATA,__dyld sections
+static int legacyDyldLookup4OldBinaries(const char* name, void** address)
+{
+#if SUPPPORT_PRE_LC_MAIN
+    if (strcmp(name, "__dyld_dlopen") == 0) {
+        *address = (void*)&dlopen;
+        return true;
+    } else if (strcmp(name, "__dyld_dlsym") == 0) {
+        *address = (void*)&dlsym;
+        return true;
+    } else if (strcmp(name, "__dyld_dladdr") == 0) {
+        *address = (void*)&dladdr;
+        return true;
+    } else if (strcmp(name, "__dyld_get_image_slide") == 0) {
+        *address = (void*)&_dyld_get_image_slide;
+        return true;
+    } else if (strcmp(name, "__dyld_make_delayed_module_initializer_calls") == 0) {
+        *address = (void*)&_dyld_make_delayed_module_initializer_calls;
+        return true;
+    } else if (strcmp(name, "__dyld_lookup_and_bind") == 0) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+        *address = (void*)&_dyld_lookup_and_bind;
+#pragma clang diagnostic pop
+        return true;
+    }
+#endif
+    *address = 0;
+    return false;
+}
+
+// this is the magic __DATA,__dyld4 section that dyld and libdyld.dylib use to rendezvous
 namespace dyld4 {
-    // dyld finds this section by name and stuffs a pointer to its API object into this section
-    // libdyld then uses this gAPIs object to call into dyld
-    __attribute__((visibility("hidden"), section("__TPRO_CONST,__dyld_apis")))
-    APIs* gAPIs = nullptr;
-}
-
-using dyld4::gAPIs;
-
-
-__attribute__((used,section ("__DATA_CONST,__helper")))
+    volatile LibdyldDyld4Section gDyld __attribute__((used, visibility("hidden"), section ("__DATA,__dyld4")))
+        = { nullptr, nullptr, { nullptr, &NXArgc, &NXArgv, (const char***)&environ, &__progname}, &legacyDyldLookup4OldBinaries
+        };
+}
+
+using dyld4::gDyld;
+
+
 static const dyld4::LibSystemHelpers sHelpers;
 
 // This is called during libSystem.dylib initialization.
@@ -72,44 +117,9 @@
 // functions which are wrapped in the LibSystemHelpers class.
 void _dyld_initializer()
 {
-#if !TARGET_OS_DRIVERKIT
-    // Initialize the memory manager prior to use
-    dyld4::MemoryManager::init();
-#endif
-#if __has_feature(tls)
-    // assign pthread_key for per-thread terminators
-    dyld::sThreadLocalVariables.initialize();
-#endif
-    gAPIs->_libdyld_initialize();
-}
-
-// FIXME: should not need dyld_all_image_info
-extern "C" VIS_HIDDEN const dyld_all_image_infos* getProcessDyldInfo();
-const dyld_all_image_infos* getProcessDyldInfo()
-{
-    return gAPIs->_dyld_all_image_infos_TEMP();
-}
-
-#if SUPPPORT_PRE_LC_MAIN
-// called by crt before main() by programs linked with 10.4 or earlier crt1.o
-extern void _dyld_make_delayed_module_initializer_calls() VIS_HIDDEN;
-void _dyld_make_delayed_module_initializer_calls()
-{
-    gAPIs->_dyld_get_main_func();
-    // We don't actually do anything here, we just need the function to exist
-    // If we had a very old binary AND a custom entry point we would have to do something, but dyld has not supported that on x86_64 in years.
-    // Instead just return an empty function and let initializers run normally
-    gAPIs->runAllInitializersForMain();
-}
-#endif
-
-static ALWAYS_INLINE void checkTPROState()
-{
-#if DYLD_FEATURE_USE_HW_TPRO
-    if ( os_thread_self_restrict_tpro_is_supported() && os_thread_self_restrict_tpro_is_writable() )
-        abort_report_np("TPRO regions should not be writable on entry to dyld\n");
-#endif // DYLD_FEATURE_USE_HW_TPRO
-}
+    gDyld.apis->_libdyld_initialize(&sHelpers);
+}
+
 
 
 //
@@ -117,85 +127,52 @@
 //
 uint32_t _dyld_image_count()
 {
-    checkTPROState();
-    return gAPIs->_dyld_image_count();
+    return gDyld.apis->_dyld_image_count();
 }
 
 const mach_header* _dyld_get_image_header(uint32_t index)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_image_header(index);
+    return gDyld.apis->_dyld_get_image_header(index);
 }
 
 intptr_t _dyld_get_image_vmaddr_slide(uint32_t index)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_image_vmaddr_slide(index);
+    return gDyld.apis->_dyld_get_image_vmaddr_slide(index);
 }
 
 const char* _dyld_get_image_name(uint32_t index)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_image_name(index);
+    return gDyld.apis->_dyld_get_image_name(index);
 }
 
 void _dyld_register_func_for_add_image(void (*func)(const mach_header* mh, intptr_t vmaddr_slide))
 {
-    checkTPROState();
-#if TARGET_OS_DRIVERKIT
-    // DriverKit signs the pointer with a diversity different than dyld expects when calling the pointer.
-#if __has_feature(ptrauth_calls)
-    func = ptrauth_auth_and_resign(func, ptrauth_key_function_pointer, ptrauth_type_discriminator(void (*)(const mach_header*,intptr_t)), ptrauth_key_function_pointer, 0);
-#endif // __has_feature(ptrauth_calls)
-#endif // !TARGET_OS_DRIVERKIT
-    gAPIs->_dyld_register_func_for_add_image(func);
+    gDyld.apis->_dyld_register_func_for_add_image(func);
 }
 
 void _dyld_register_func_for_remove_image(void (*func)(const mach_header* mh, intptr_t vmaddr_slide))
 {
-    checkTPROState();
-#if TARGET_OS_DRIVERKIT
-    // DriverKit signs the pointer with a diversity different than dyld expects when calling the pointer.
-#if __has_feature(ptrauth_calls)
-    func = ptrauth_auth_and_resign(func, ptrauth_key_function_pointer, ptrauth_type_discriminator(void (*)(const mach_header*,intptr_t)), ptrauth_key_function_pointer, 0);
-#endif // __has_feature(ptrauth_calls)
-#endif // !TARGET_OS_DRIVERKIT
-    gAPIs->_dyld_register_func_for_remove_image(func);
+    gDyld.apis->_dyld_register_func_for_remove_image(func);
 }
 
 int32_t NSVersionOfLinkTimeLibrary(const char* libraryName)
 {
-    checkTPROState();
-    return gAPIs->NSVersionOfLinkTimeLibrary(libraryName);
+    return gDyld.apis->NSVersionOfLinkTimeLibrary(libraryName);
 }
 
 int32_t NSVersionOfRunTimeLibrary(const char* libraryName)
 {
-    checkTPROState();
-    return gAPIs->NSVersionOfRunTimeLibrary(libraryName);
+    return gDyld.apis->NSVersionOfRunTimeLibrary(libraryName);
 }
 
 int _NSGetExecutablePath(char* buf, uint32_t* bufsize)
 {
-    checkTPROState();
-    return gAPIs->_NSGetExecutablePath(buf, bufsize);
+    return gDyld.apis->_NSGetExecutablePath(buf, bufsize);
 }
 
 void _dyld_fork_child()
 {
-    // checkTPROState();
-
-    // FIXME: rdar://135425853 There seems to be a bug where we have TPRO RW here, even if it was RO before fork().
-#if DYLD_FEATURE_USE_HW_TPRO
-    if ( os_thread_self_restrict_tpro_is_supported() && os_thread_self_restrict_tpro_is_writable() ) {
-        os_compiler_barrier();
-        os_thread_self_restrict_tpro_to_ro();
-        os_compiler_barrier();
-    }
-    checkTPROState();
-#endif // DYLD_FEATURE_USE_HW_TPRO
-
-    gAPIs->_dyld_fork_child();
+    gDyld.apis->_dyld_fork_child();
 }
 
 //
@@ -203,39 +180,33 @@
 //
 int dladdr(const void* addr, Dl_info* result)
 {
-    checkTPROState();
-    return gAPIs->dladdr(addr, result);
-}
-
-void* dlsym(void* handle, const char* symbol)
-{
-    checkTPROState();
-    return gAPIs->dlsym(handle, symbol);
+    return gDyld.apis->dladdr(addr, result);
 }
 
 #if !TARGET_OS_DRIVERKIT
 void* dlopen(const char* path, int mode)
 {
-    checkTPROState();
-    return gAPIs->dlopen(path, mode);
+    return gDyld.apis->dlopen(path, mode);
 }
 
 int dlclose(void* handle)
 {
-    checkTPROState();
-    return gAPIs->dlclose(handle);
+    return gDyld.apis->dlclose(handle);
 }
 
 char* dlerror()
 {
-    checkTPROState();
-    return gAPIs->dlerror();
+    return gDyld.apis->dlerror();
+}
+
+void* dlsym(void* handle, const char* symbol)
+{
+    return gDyld.apis->dlsym(handle, symbol);
 }
 
 bool dlopen_preflight(const char* path)
 {
-    checkTPROState();
-    return gAPIs->dlopen_preflight(path);
+    return gDyld.apis->dlopen_preflight(path);
 }
 #endif
 
@@ -245,232 +216,195 @@
 #if TARGET_OS_OSX
 NSObjectFileImageReturnCode NSCreateObjectFileImageFromFile(const char* pathName, NSObjectFileImage* objectFileImage)
 {
-    checkTPROState();
-    return gAPIs->NSCreateObjectFileImageFromFile(pathName, objectFileImage);
+    return gDyld.apis->NSCreateObjectFileImageFromFile(pathName, objectFileImage);
 }
 
 NSObjectFileImageReturnCode NSCreateObjectFileImageFromMemory(const void* address, size_t size, NSObjectFileImage* objectFileImage)
 {
-    checkTPROState();
-    return gAPIs->NSCreateObjectFileImageFromMemory(address, size, objectFileImage);
+    return gDyld.apis->NSCreateObjectFileImageFromMemory(address, size, objectFileImage);
 }
 
 bool NSDestroyObjectFileImage(NSObjectFileImage objectFileImage)
 {
-    checkTPROState();
-    return gAPIs->NSDestroyObjectFileImage(objectFileImage);
+    return gDyld.apis->NSDestroyObjectFileImage(objectFileImage);
 }
 
 uint32_t NSSymbolDefinitionCountInObjectFileImage(NSObjectFileImage objectFileImage)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return 0;
 }
 
 const char* NSSymbolDefinitionNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return nullptr;
 }
 
 uint32_t NSSymbolReferenceCountInObjectFileImage(NSObjectFileImage objectFileImage)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return 0;
 }
 
 const char* NSSymbolReferenceNameInObjectFileImage(NSObjectFileImage objectFileImage, uint32_t ordinal, bool* tentative_definition)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return nullptr;
 }
 
 bool NSIsSymbolDefinedInObjectFileImage(NSObjectFileImage objectFileImage, const char* symbolName)
 {
-    checkTPROState();
-    return gAPIs->NSIsSymbolDefinedInObjectFileImage(objectFileImage, symbolName);
+    return gDyld.apis->NSIsSymbolDefinedInObjectFileImage(objectFileImage, symbolName);
 }
 
 void* NSGetSectionDataInObjectFileImage(NSObjectFileImage objectFileImage, const char* segmentName, const char* sectionName, size_t* size)
 {
-    checkTPROState();
-    return gAPIs->NSGetSectionDataInObjectFileImage(objectFileImage, segmentName, sectionName, size);
+    return gDyld.apis->NSGetSectionDataInObjectFileImage(objectFileImage, segmentName, sectionName, size);
 }
 
 const char* NSNameOfModule(NSModule m)
 {
-    checkTPROState();
-    return gAPIs->NSNameOfModule(m);
+    return gDyld.apis->NSNameOfModule(m);
 }
 
 const char* NSLibraryNameForModule(NSModule m)
 {
-    checkTPROState();
-    return gAPIs->NSLibraryNameForModule(m);
+    return gDyld.apis->NSLibraryNameForModule(m);
 }
 
 NSModule NSLinkModule(NSObjectFileImage objectFileImage, const char* moduleName, uint32_t options)
 {
-    checkTPROState();
-    return gAPIs->NSLinkModule(objectFileImage, moduleName, options);
+    return gDyld.apis->NSLinkModule(objectFileImage, moduleName, options);
 }
 
 bool NSUnLinkModule(NSModule module, uint32_t options)
 {
-    checkTPROState();
-    return gAPIs->NSUnLinkModule(module, options);
+    return gDyld.apis->NSUnLinkModule(module, options);
 }
 
 bool NSIsSymbolNameDefined(const char* symbolName)
 {
-    checkTPROState();
-    return gAPIs->NSIsSymbolNameDefined(symbolName);
+    return gDyld.apis->NSIsSymbolNameDefined(symbolName);
 }
 
 bool NSIsSymbolNameDefinedWithHint(const char* symbolName, const char* libraryNameHint)
 {
-    checkTPROState();
-    return gAPIs->NSIsSymbolNameDefinedWithHint(symbolName, libraryNameHint);
+    return gDyld.apis->NSIsSymbolNameDefinedWithHint(symbolName, libraryNameHint);
 }
 
 bool NSIsSymbolNameDefinedInImage(const mach_header* image, const char* symbolName)
 {
-    checkTPROState();
-    return gAPIs->NSIsSymbolNameDefinedInImage(image, symbolName);
+    return gDyld.apis->NSIsSymbolNameDefinedInImage(image, symbolName);
 }
 
 NSSymbol NSLookupAndBindSymbol(const char* symbolName)
 {
-    checkTPROState();
-    return gAPIs->NSLookupAndBindSymbol(symbolName);
+    return gDyld.apis->NSLookupAndBindSymbol(symbolName);
 }
 
 NSSymbol NSLookupAndBindSymbolWithHint(const char* symbolName, const char* libraryNameHint)
 {
-    checkTPROState();
-    return gAPIs->NSLookupAndBindSymbolWithHint(symbolName, libraryNameHint);
+    return gDyld.apis->NSLookupAndBindSymbolWithHint(symbolName, libraryNameHint);
 }
 
 NSSymbol NSLookupSymbolInModule(NSModule module, const char* symbolName)
 {
-    checkTPROState();
-    return gAPIs->NSLookupSymbolInModule(module, symbolName);
+    return gDyld.apis->NSLookupSymbolInModule(module, symbolName);
 }
 
 NSSymbol NSLookupSymbolInImage(const mach_header* image, const char* symbolName, uint32_t options)
 {
-    checkTPROState();
-    return gAPIs->NSLookupSymbolInImage(image, symbolName, options);
+    return gDyld.apis->NSLookupSymbolInImage(image, symbolName, options);
 }
 
 const char* NSNameOfSymbol(NSSymbol symbol)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return nullptr;
 }
 
 void* NSAddressOfSymbol(NSSymbol symbol)
 {
-    checkTPROState();
-    return gAPIs->NSAddressOfSymbol(symbol);
+    return gDyld.apis->NSAddressOfSymbol(symbol);
 }
 
 NSModule NSModuleForSymbol(NSSymbol symbol)
 {
-    checkTPROState();
-    return gAPIs->NSModuleForSymbol(symbol);
+    return gDyld.apis->NSModuleForSymbol(symbol);
 }
 
 void NSLinkEditError(NSLinkEditErrors* c, int* errorNumber, const char** fileName, const char** errorString)
 {
-    checkTPROState();
-    gAPIs->NSLinkEditError(c, errorNumber, fileName, errorString);
+    gDyld.apis->NSLinkEditError(c, errorNumber, fileName, errorString);
 }
 
 void NSInstallLinkEditErrorHandlers(const NSLinkEditErrorHandlers* handlers)
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
 }
 
 bool NSAddLibrary(const char* pathName)
 {
-    checkTPROState();
-    return gAPIs->NSAddLibrary(pathName);
+    return gDyld.apis->NSAddLibrary(pathName);
 }
 
 bool NSAddLibraryWithSearching(const char* pathName)
 {
-    checkTPROState();
-    return gAPIs->NSAddLibraryWithSearching(pathName);
+    return gDyld.apis->NSAddLibraryWithSearching(pathName);
 }
 
 const mach_header* NSAddImage(const char* image_name, uint32_t options)
 {
-    checkTPROState();
-    return gAPIs->NSAddImage(image_name, options);
+    return gDyld.apis->NSAddImage(image_name, options);
 }
 
 bool _dyld_present()
 {
-    checkTPROState();
     return true;
 }
 
 bool _dyld_launched_prebound()
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return false;
 }
 
 bool _dyld_all_twolevel_modules_prebound()
 {
-    checkTPROState();
-    gAPIs->obsolete();
+    gDyld.apis->obsolete();
     return false;
 }
 
 bool _dyld_bind_fully_image_containing_address(const void* address)
 {
-    checkTPROState();
     // in dyld4, everything is always fully bound
     return true;
 }
 
 bool _dyld_image_containing_address(const void* address)
 {
-    checkTPROState();
-    return gAPIs->_dyld_image_containing_address(address);
+    return gDyld.apis->_dyld_image_containing_address(address);
 }
 
 void _dyld_lookup_and_bind(const char* symbol_name, void** address, NSModule* module)
 {
-    checkTPROState();
-    gAPIs->_dyld_lookup_and_bind(symbol_name, address, module);
+    gDyld.apis->_dyld_lookup_and_bind(symbol_name, address, module);
 }
 
 void _dyld_lookup_and_bind_with_hint(const char* symbol_name, const char* library_name_hint, void** address, NSModule* module)
 {
-    checkTPROState();
-    gAPIs->_dyld_lookup_and_bind_with_hint(symbol_name, library_name_hint, address, module);
+    gDyld.apis->_dyld_lookup_and_bind_with_hint(symbol_name, library_name_hint, address, module);
 }
 
 void _dyld_lookup_and_bind_fully(const char* symbol_name, void** address, NSModule* module)
 {
-    checkTPROState();
-    gAPIs->_dyld_lookup_and_bind_fully(symbol_name, address, module);
+    gDyld.apis->_dyld_lookup_and_bind_fully(symbol_name, address, module);
 }
 
 const mach_header* _dyld_get_image_header_containing_address(const void* address)
 {
-    checkTPROState();
-    return gAPIs->dyld_image_header_containing_address(address);
+    return gDyld.apis->dyld_image_header_containing_address(address);
 }
 #endif // TARGET_OS_OSX
 
@@ -480,21 +414,18 @@
 //
 intptr_t  _dyld_get_image_slide(const mach_header* mh)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_image_slide(mh);
+    return gDyld.apis->_dyld_get_image_slide(mh);
 }
 
 const char* dyld_image_path_containing_address(const void* addr)
 {
-    checkTPROState();
-    return gAPIs->dyld_image_path_containing_address(addr);
+    return gDyld.apis->dyld_image_path_containing_address(addr);
 }
 
 #if !__USING_SJLJ_EXCEPTIONS__
 bool _dyld_find_unwind_sections(void* addr, dyld_unwind_sections* info)
 {
-    checkTPROState();
-    return gAPIs->_dyld_find_unwind_sections(addr, info);
+    return gDyld.apis->_dyld_find_unwind_sections(addr, info);
 }
 #endif
 
@@ -504,26 +435,22 @@
 //
 uint32_t dyld_get_sdk_version(const mach_header* mh)
 {
-    checkTPROState();
-    return gAPIs->dyld_get_sdk_version(mh);
+    return gDyld.apis->dyld_get_sdk_version(mh);
 }
 
 uint32_t dyld_get_min_os_version(const mach_header* mh)
 {
-    checkTPROState();
-    return gAPIs->dyld_get_min_os_version(mh);
+    return gDyld.apis->dyld_get_min_os_version(mh);
 }
 
 uint32_t dyld_get_program_sdk_version()
 {
-    checkTPROState();
-    return gAPIs->dyld_get_program_sdk_version();
+    return gDyld.apis->dyld_get_program_sdk_version();
 }
 
 uint32_t dyld_get_program_min_os_version()
 {
-    checkTPROState();
-    return gAPIs->dyld_get_program_min_os_version();
+    return gDyld.apis->dyld_get_program_min_os_version();
 }
 
 
@@ -533,8 +460,7 @@
 //
 bool dyld_process_is_restricted()
 {
-    checkTPROState();
-    return gAPIs->dyld_process_is_restricted();
+    return gDyld.apis->dyld_process_is_restricted();
 }
 
 
@@ -544,45 +470,31 @@
 //
 bool dyld_shared_cache_some_image_overridden()
 {
-    checkTPROState();
-    return gAPIs->dyld_shared_cache_some_image_overridden();
+    return gDyld.apis->dyld_shared_cache_some_image_overridden();
 }
 
 void dyld_dynamic_interpose(const mach_header* mh, const dyld_interpose_tuple array[], size_t count)
 {
-    checkTPROState();
     // <rdar://74287303> (Star 21A185 REG: Adobe Photoshop 2021 crash on launch)
     return;
 }
 
-// call by C++ codegen to register a function to call when a thread goes away
 void _tlv_atexit(void (*termFunc)(void* objAddr), void* objAddr)
 {
-    checkTPROState();
-#if __has_feature(tls)
-   dyld::sThreadLocalVariables.addTermFunc(termFunc, objAddr);
+    gDyld.apis->_tlv_atexit(termFunc, objAddr);
+}
+
+#if !TARGET_OS_DRIVERKIT
+void _tlv_bootstrap()
+{
+    gDyld.apis->_tlv_bootstrap();
+}
 #endif
-}
-
-// called by exit() in libc to call all tlv_atexit handlers
+
 void _tlv_exit()
 {
-    checkTPROState();
-#if __has_feature(tls)
-    dyld::sThreadLocalVariables.exit();
-#endif
-}
-
-// for catching uses of thread_locals before they are set up
-extern "C" void _tlv_bootstrap_error();
-VIS_HIDDEN void _tlv_bootstrap_error()
-{
-    checkTPROState();
-#if __has_feature(tls) && !TARGET_OS_EXCLAVEKIT
-    abort_report_np("thread locals not initialized");
-#endif
-}
-
+    gDyld.apis->_tlv_exit();
+}
 
 
 //
@@ -590,33 +502,28 @@
 //
 int dyld_shared_cache_iterate_text(const uuid_t cacheUuid, void (^callback)(const dyld_shared_cache_dylib_text_info* info))
 {
-    checkTPROState();
-    return gAPIs->dyld_shared_cache_iterate_text(cacheUuid, callback);
+    return gDyld.apis->dyld_shared_cache_iterate_text(cacheUuid, callback);
 }
 
 const mach_header* dyld_image_header_containing_address(const void* addr)
 {
-    checkTPROState();
-    return gAPIs->dyld_image_header_containing_address(addr);
+    return gDyld.apis->dyld_image_header_containing_address(addr);
 }
 
 const char* dyld_shared_cache_file_path()
 {
-    checkTPROState();
-    return gAPIs->dyld_shared_cache_file_path();
+    return gDyld.apis->dyld_shared_cache_file_path();
 }
 
 #if TARGET_OS_WATCH
 uint32_t  dyld_get_program_sdk_watch_os_version()
 {
-    checkTPROState();
-    return gAPIs->dyld_get_program_sdk_watch_os_version();
+    return gDyld.apis->dyld_get_program_sdk_watch_os_version();
 }
 
 uint32_t  dyld_get_program_min_watch_os_version()
 {
-    checkTPROState();
-    return gAPIs->dyld_get_program_min_watch_os_version();
+    return gDyld.apis->dyld_get_program_min_watch_os_version();
 }
 #endif // TARGET_OS_WATCH
 
@@ -627,32 +534,27 @@
 //
 void _dyld_objc_notify_register(_dyld_objc_notify_mapped m, _dyld_objc_notify_init i, _dyld_objc_notify_unmapped u)
 {
-    checkTPROState();
-    gAPIs->_dyld_objc_notify_register(m, i, u);
+    gDyld.apis->_dyld_objc_notify_register(m, i, u);
 }
 
 bool _dyld_get_image_uuid(const mach_header* mh, uuid_t uuid)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_image_uuid(mh, uuid);
+    return gDyld.apis->_dyld_get_image_uuid(mh, uuid);
 }
 
 bool _dyld_get_shared_cache_uuid(uuid_t uuid)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_shared_cache_uuid(uuid);
+    return gDyld.apis->_dyld_get_shared_cache_uuid(uuid);
 }
 
 bool _dyld_is_memory_immutable(const void* addr, size_t length)
 {
-    checkTPROState();
-    return gAPIs->_dyld_is_memory_immutable(addr, length);
+    return gDyld.apis->_dyld_is_memory_immutable(addr, length);
 }
 
 int  dyld_shared_cache_find_iterate_text(const uuid_t cacheUuid, const char* extraSearchDirs[], void (^callback)(const dyld_shared_cache_dylib_text_info* info))
 {
-    checkTPROState();
-    return gAPIs->dyld_shared_cache_find_iterate_text(cacheUuid, extraSearchDirs, callback);
+    return gDyld.apis->dyld_shared_cache_find_iterate_text(cacheUuid, extraSearchDirs, callback);
 }
 
 
@@ -662,140 +564,139 @@
 //
 const void* _dyld_get_shared_cache_range(size_t* length)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_shared_cache_range(length);
-}
+    return gDyld.apis->_dyld_get_shared_cache_range(length);
+}
+
+#if TARGET_OS_BRIDGE
+uint32_t dyld_get_program_sdk_bridge_os_version()
+{
+    return gDyld.apis->dyld_get_program_sdk_bridge_os_version();
+}
+
+uint32_t dyld_get_program_min_bridge_os_version()
+{
+    return gDyld.apis->dyld_get_program_min_bridge_os_version();
+}
+#endif // TARGET_OS_BRIDGE
+
+
 
 //
 // MARK: --- APIs iOS 12, macOS 10.14 ---
 //
 dyld_platform_t dyld_get_active_platform()
 {
-    checkTPROState();
-    return gAPIs->dyld_get_active_platform();
+    return gDyld.apis->dyld_get_active_platform();
 }
 
 dyld_platform_t dyld_get_base_platform(dyld_platform_t platform)
 {
-    checkTPROState();
-    return gAPIs->dyld_get_base_platform(platform);
+    return gDyld.apis->dyld_get_base_platform(platform);
 }
 
 bool dyld_is_simulator_platform(dyld_platform_t platform)
 {
-    checkTPROState();
-    return gAPIs->dyld_is_simulator_platform(platform);
+    return gDyld.apis->dyld_is_simulator_platform(platform);
 }
 
 bool dyld_sdk_at_least(const mach_header* mh, dyld_build_version_t version)
 {
-    checkTPROState();
-    return gAPIs->dyld_sdk_at_least(mh, version);
+    return gDyld.apis->dyld_sdk_at_least(mh, version);
 }
 
 bool dyld_minos_at_least(const mach_header* mh, dyld_build_version_t version)
 {
-    checkTPROState();
-    return gAPIs->dyld_minos_at_least(mh, version);
+    return gDyld.apis->dyld_minos_at_least(mh, version);
 }
 
 bool dyld_program_sdk_at_least(dyld_build_version_t version)
 {
-    checkTPROState();
-    return gAPIs->dyld_program_sdk_at_least(version);
+    return gDyld.apis->dyld_program_sdk_at_least(version);
 }
 
 bool dyld_program_minos_at_least(dyld_build_version_t version)
 {
-    checkTPROState();
-    return gAPIs->dyld_program_minos_at_least(version);
+    return gDyld.apis->dyld_program_minos_at_least(version);
 }
 
 void dyld_get_image_versions(const mach_header* mh, void (^callback)(dyld_platform_t platform, uint32_t sdk_version, uint32_t min_version))
 {
-    checkTPROState();
-    gAPIs->dyld_get_image_versions(mh, callback);
+    gDyld.apis->dyld_get_image_versions(mh, callback);
 }
 
 void _dyld_images_for_addresses(unsigned count, const void* addresses[], dyld_image_uuid_offset infos[])
 {
-    checkTPROState();
-    gAPIs->_dyld_images_for_addresses(count, addresses, infos);
+    gDyld.apis->_dyld_images_for_addresses(count, addresses, infos);
 }
 
 void _dyld_register_for_image_loads(void (*func)(const mach_header* mh, const char* path, bool unloadable))
 {
-    checkTPROState();
-    gAPIs->_dyld_register_for_image_loads(func);
-}
+    gDyld.apis->_dyld_register_for_image_loads(func);
+}
+
+
 
 //
 // MARK: --- APIs added iOS 13, macOS 10.15 ---
 //
 void _dyld_atfork_prepare()
 {
-    checkTPROState();
-    gAPIs->_dyld_atfork_prepare();
+    gDyld.apis->_dyld_atfork_prepare();
 }
 
 void _dyld_atfork_parent()
 {
-    checkTPROState();
-    gAPIs->_dyld_atfork_parent();
+    gDyld.apis->_dyld_atfork_parent();
 }
 
 bool dyld_need_closure(const char* execPath, const char* dataContainerRootDir)
 {
-    checkTPROState();
-    return gAPIs->dyld_need_closure(execPath, dataContainerRootDir);
+    return gDyld.apis->dyld_need_closure(execPath, dataContainerRootDir);
 }
 
 bool dyld_has_inserted_or_interposing_libraries()
 {
-    checkTPROState();
-    return gAPIs->dyld_has_inserted_or_interposing_libraries();
+    return gDyld.apis->dyld_has_inserted_or_interposing_libraries();
 }
 
 bool _dyld_shared_cache_optimized()
 {
-    checkTPROState();
-    return gAPIs->_dyld_shared_cache_optimized();
+    return gDyld.apis->_dyld_shared_cache_optimized();
 }
 
 bool _dyld_shared_cache_is_locally_built()
 {
-    checkTPROState();
-    return gAPIs->_dyld_shared_cache_is_locally_built();
+    return gDyld.apis->_dyld_shared_cache_is_locally_built();
 }
 
 void _dyld_register_for_bulk_image_loads(void (*func)(unsigned imageCount, const mach_header* mhs[], const char* paths[]))
 {
-    checkTPROState();
-    gAPIs->_dyld_register_for_bulk_image_loads(func);
+    gDyld.apis->_dyld_register_for_bulk_image_loads(func);
 }
 
 void _dyld_register_driverkit_main(void (*mainFunc)(void))
 {
-    checkTPROState();
-    gAPIs->_dyld_register_driverkit_main(mainFunc);
+    gDyld.apis->_dyld_register_driverkit_main(mainFunc);
+}
+
+void _dyld_missing_symbol_abort()
+{
+    gDyld.apis->_dyld_missing_symbol_abort();
 }
 
 const char* _dyld_get_objc_selector(const char* selName)
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_objc_selector(selName);
+    return gDyld.apis->_dyld_get_objc_selector(selName);
 }
 
 void _dyld_for_each_objc_class(const char* className, void (^callback)(void* classPtr, bool isLoaded, bool* stop))
 {
-    checkTPROState();
-    gAPIs->_dyld_for_each_objc_class(className, callback);
+    gDyld.apis->_dyld_for_each_objc_class(className, callback);
 }
 
 void _dyld_for_each_objc_protocol(const char* protocolName, void (^callback)(void* protocolPtr, bool isLoaded, bool* stop))
 {
-    checkTPROState();
-    gAPIs->_dyld_for_each_objc_protocol(protocolName, callback);
+    gDyld.apis->_dyld_for_each_objc_protocol(protocolName, callback);
 }
 
 
@@ -804,52 +705,46 @@
 //
 uint32_t _dyld_launch_mode()
 {
-    checkTPROState();
-    return gAPIs->_dyld_launch_mode();
+    return gDyld.apis->_dyld_launch_mode();
 }
 
 bool _dyld_is_objc_constant(DyldObjCConstantKind kind, const void* addr)
 {
-    checkTPROState();
-    return gAPIs->_dyld_is_objc_constant(kind, addr);
+    return gDyld.apis->_dyld_is_objc_constant(kind, addr);
 }
 
 bool _dyld_has_fix_for_radar(const char* rdar)
 {
-    checkTPROState();
-    return gAPIs->_dyld_has_fix_for_radar(rdar);
+    return gDyld.apis->_dyld_has_fix_for_radar(rdar);
 }
 
 const char* _dyld_shared_cache_real_path(const char* path)
 {
-    checkTPROState();
-    return gAPIs->_dyld_shared_cache_real_path(path);
+    return gDyld.apis->_dyld_shared_cache_real_path(path);
 }
 
 #if !TARGET_OS_DRIVERKIT
 bool _dyld_shared_cache_contains_path(const char* path)
 {
-    checkTPROState();
-    return gAPIs->_dyld_shared_cache_contains_path(path);
+    return gDyld.apis->_dyld_shared_cache_contains_path(path);
 }
 
 void* dlopen_from(const char* path, int mode, void* addressInCaller)
 {
-    checkTPROState();
-    return gAPIs->dlopen_from(path, mode, addressInCaller);
-}
-
+    return gDyld.apis->dlopen_from(path, mode, addressInCaller);
+}
+
+#if !__i386__
 void* dlopen_audited(const char* path, int mode)
 {
-    checkTPROState();
-    return gAPIs->dlopen_audited(path, mode);
-}
+    return gDyld.apis->dlopen_audited(path, mode);
+}
+#endif // !__i386__
 #endif // !TARGET_OS_DRIVERKIT
 
 const struct mach_header* _dyld_get_prog_image_header()
 {
-    checkTPROState();
-    return gAPIs->_dyld_get_prog_image_header();
+    return gDyld.apis->_dyld_get_prog_image_header();
 }
 
 
@@ -859,100 +754,36 @@
 //
 void _dyld_visit_objc_classes(void (^callback)(const void* classPtr))
 {
-    checkTPROState();
-    gAPIs->_dyld_visit_objc_classes(callback);
+    gDyld.apis->_dyld_visit_objc_classes(callback);
 }
 
 uint32_t _dyld_objc_class_count(void)
 {
-    checkTPROState();
-    return gAPIs->_dyld_objc_class_count();
+    return gDyld.apis->_dyld_objc_class_count();
 }
 
 bool _dyld_objc_uses_large_shared_cache(void)
 {
-    checkTPROState();
-    return gAPIs->_dyld_objc_uses_large_shared_cache();
+    return gDyld.apis->_dyld_objc_uses_large_shared_cache();
 }
 
 struct _dyld_protocol_conformance_result _dyld_find_protocol_conformance(const void *protocolDescriptor,
                                                                          const void *metadataType,
                                                                          const void *typeDescriptor)
 {
-    checkTPROState();
-    return gAPIs->_dyld_find_protocol_conformance(protocolDescriptor, metadataType, typeDescriptor);
+    return gDyld.apis->_dyld_find_protocol_conformance(protocolDescriptor, metadataType, typeDescriptor);
 }
 
 struct _dyld_protocol_conformance_result _dyld_find_foreign_type_protocol_conformance(const void *protocol,
                                                                                       const char *foreignTypeIdentityStart,
                                                                                       size_t foreignTypeIdentityLength)
 {
-    checkTPROState();
-    return gAPIs->_dyld_find_foreign_type_protocol_conformance(protocol, foreignTypeIdentityStart, foreignTypeIdentityLength);
+    return gDyld.apis->_dyld_find_foreign_type_protocol_conformance(protocol, foreignTypeIdentityStart, foreignTypeIdentityLength);
 }
 
 uint32_t _dyld_swift_optimizations_version()
 {
-    checkTPROState();
-    return gAPIs->_dyld_swift_optimizations_version();
-}
-
-
-
-//
-// MARK: --- APIs added iOS 16, macOS 13 ---
-//
-const struct mach_header* _dyld_get_dlopen_image_header(void* handle)
-{
-    checkTPROState();
-    return gAPIs->_dyld_get_dlopen_image_header(handle);
-}
-
-void _dyld_objc_register_callbacks(const _dyld_objc_callbacks* callbacks)
-{
-    checkTPROState();
-    // Convert from the callbacks we are passed in to those which wrap the function
-    // pointers to make them safe in dyld
-    if ( callbacks->version == 4 ) {
-        const _dyld_objc_callbacks_v4* v4 = (const _dyld_objc_callbacks_v4*)callbacks;
-
-        dyld4::ObjCCallbacksV4 newCallbacks;
-        newCallbacks.version = callbacks->version;
-        newCallbacks.mapped = v4->mapped;
-        newCallbacks.init = v4->init;
-        newCallbacks.unmapped = v4->unmapped;
-        newCallbacks.patches = v4->patches;
-        gAPIs->_dyld_objc_register_callbacks(&newCallbacks);
-    }
-    else {
-        dyld4::ObjCCallbacks newCallbacks;
-        newCallbacks.version = callbacks->version;
-        gAPIs->_dyld_objc_register_callbacks(&newCallbacks);
-    }
-}
-
-bool _dyld_has_preoptimized_swift_protocol_conformances(const struct mach_header* mh)
-{
-    checkTPROState();
-    return gAPIs->_dyld_has_preoptimized_swift_protocol_conformances(mh);
-}
-
-struct _dyld_protocol_conformance_result _dyld_find_protocol_conformance_on_disk(const void *protocolDescriptor,
-                                                                                 const void *metadataType,
-                                                                                 const void *typeDescriptor,
-                                                                                 uint32_t flags)
-{
-    checkTPROState();
-    return gAPIs->_dyld_find_protocol_conformance_on_disk(protocolDescriptor, metadataType, typeDescriptor, flags);
-}
-
-struct _dyld_protocol_conformance_result _dyld_find_foreign_type_protocol_conformance_on_disk(const void *protocol,
-                                                                                              const char *foreignTypeIdentityStart,
-                                                                                              size_t foreignTypeIdentityLength,
-                                                                                              uint32_t flags)
-{
-    checkTPROState();
-    return gAPIs->_dyld_find_foreign_type_protocol_conformance_on_disk(protocol, foreignTypeIdentityStart, foreignTypeIdentityLength, flags);
+    return gDyld.apis->_dyld_swift_optimizations_version();
 }
 
 //
@@ -960,208 +791,24 @@
 //
 void _dyld_dlopen_atfork_prepare()
 {
-    checkTPROState();
-    gAPIs->_dyld_before_fork_dlopen();
+    gDyld.apis->_dyld_before_fork_dlopen();
 }
 
 void _dyld_dlopen_atfork_parent()
 {
-    checkTPROState();
-    gAPIs->_dyld_after_fork_dlopen_parent();
+    gDyld.apis->_dyld_after_fork_dlopen_parent();
 }
 
 void _dyld_dlopen_atfork_child()
 {
-    checkTPROState();
-    gAPIs->_dyld_after_fork_dlopen_child();
-}
-
-//
-// MARK: --- APIs added iOS 17.x, macOS 14.x ---
-//
-struct _dyld_section_info_result _dyld_lookup_section_info(const struct mach_header* mh,
-                                                           _dyld_section_location_info_t locationHandle,
-                                                           _dyld_section_location_kind kind)
-{
-    checkTPROState();
-    return gAPIs->_dyld_lookup_section_info(mh, locationHandle, kind);
-}
-
-
-_dyld_pseudodylib_callbacks_handle _dyld_pseudodylib_register_callbacks(const struct _dyld_pseudodylib_callbacks* callbacks)
-{
-    checkTPROState();
-    // Convert from the callbacks we are passed in to those which wrap the function
-    // pointers to make them safe in dyld
-    if ( callbacks->version == 1 ) {
-        const auto* callbacks_v1 = (const _dyld_pseudodylib_callbacks_v1*)callbacks;
-
-        dyld4::PseudoDylibRegisterCallbacksV1 newCallbacks;
-        newCallbacks.version = callbacks->version;
-        newCallbacks.dispose_error_message  = callbacks_v1->dispose_error_message;
-        newCallbacks.initialize             = callbacks_v1->initialize;
-        newCallbacks.deinitialize           = callbacks_v1->deinitialize;
-        newCallbacks.lookup_symbols         = callbacks_v1->lookup_symbols;
-        newCallbacks.lookup_address         = callbacks_v1->lookup_address;
-        newCallbacks.find_unwind_sections   = callbacks_v1->find_unwind_sections;
-        return gAPIs->_dyld_pseudodylib_register_callbacks(&newCallbacks);
-    } else if ( callbacks->version == 2 ) {
-        const auto* callbacks_v2 = (const _dyld_pseudodylib_callbacks_v2*)callbacks;
-
-        dyld4::PseudoDylibRegisterCallbacksV2 newCallbacks;
-        newCallbacks.version = callbacks->version;
-        newCallbacks.dispose_string         = callbacks_v2->dispose_string;
-        newCallbacks.initialize             = callbacks_v2->initialize;
-        newCallbacks.deinitialize           = callbacks_v2->deinitialize;
-        newCallbacks.lookup_symbols         = callbacks_v2->lookup_symbols;
-        newCallbacks.lookup_address         = callbacks_v2->lookup_address;
-        newCallbacks.find_unwind_sections   = callbacks_v2->find_unwind_sections;
-        newCallbacks.loadable_at_path       = callbacks_v2->loadable_at_path;
-        return gAPIs->_dyld_pseudodylib_register_callbacks(&newCallbacks);
-    } else if ( callbacks->version == 3 ) {
-        const auto* callbacks_v3 = (const _dyld_pseudodylib_callbacks_v3*)callbacks;
-
-        dyld4::PseudoDylibRegisterCallbacksV3 newCallbacks;
-        newCallbacks.version = callbacks->version;
-        newCallbacks.dispose_string             = callbacks_v3->dispose_string;
-        newCallbacks.initialize                 = callbacks_v3->initialize;
-        newCallbacks.deinitialize               = callbacks_v3->deinitialize;
-        newCallbacks.lookup_symbols             = callbacks_v3->lookup_symbols;
-        newCallbacks.lookup_address             = callbacks_v3->lookup_address;
-        newCallbacks.find_unwind_sections       = callbacks_v3->find_unwind_sections;
-        newCallbacks.loadable_at_path           = callbacks_v3->loadable_at_path;
-        newCallbacks.finalize_requested_symbols = callbacks_v3->finalize_requested_symbols;
-        return gAPIs->_dyld_pseudodylib_register_callbacks(&newCallbacks);
-    } else {
-        dyld4::PseudoDylibRegisterCallbacks newCallbacks;
-        newCallbacks.version = callbacks->version;
-        return gAPIs->_dyld_pseudodylib_register_callbacks(&newCallbacks);
-    }
-}
-
-void _dyld_pseudodylib_deregister_callbacks(_dyld_pseudodylib_callbacks_handle callbacks_handle)
-{
-    checkTPROState();
-    gAPIs->_dyld_pseudodylib_deregister_callbacks(callbacks_handle);
-}
-
-_dyld_pseudodylib_handle _dyld_pseudodylib_register(
-        void* addr, size_t size, _dyld_pseudodylib_callbacks_handle callbacks_handle, void* context)
-{
-    checkTPROState();
-    return gAPIs->_dyld_pseudodylib_register(addr, size, callbacks_handle, context);
-}
-
-void _dyld_pseudodylib_deregister(_dyld_pseudodylib_handle pd_handle)
-{
-    checkTPROState();
-    gAPIs->_dyld_pseudodylib_deregister(pd_handle);
-}
-
-bool _dyld_is_preoptimized_objc_image_loaded(uint16_t imageID)
-{
-    checkTPROState();
-    return gAPIs->_dyld_is_preoptimized_objc_image_loaded(imageID);
-}
-
-void* _dyld_for_objc_header_opt_rw()
-{
-    checkTPROState();
-    return gAPIs->_dyld_for_objc_header_opt_rw();
-}
-
-const void* _dyld_for_objc_header_opt_ro()
-{
-    checkTPROState();
-    return gAPIs->_dyld_for_objc_header_opt_ro();
-}
-
-//
-// MARK: --- APIs added iOS 18.x, macOS 15.x ---
-//
-bool _dyld_dlsym_blocked()
-{
-    checkTPROState();
-    return gAPIs->_dyld_dlsym_blocked();
-}
-
-void _dyld_register_dlsym_notifier(void (*callback)(const char* symbolName))
-{
-    checkTPROState();
-     gAPIs->_dyld_register_dlsym_notifier(callback);
-}
-
-const void* _dyld_get_swift_prespecialized_data()
-{
-    checkTPROState();
-    return gAPIs->_dyld_get_swift_prespecialized_data();
-}
-
-bool _dyld_is_pseudodylib(void* handle)
-{
-    checkTPROState();
-    return gAPIs->_dyld_is_pseudodylib(handle);
-}
-
-const void *_dyld_find_pointer_hash_table_entry(const void *table,
-                                               const void *key1,
-                                               size_t restKeysCount,
-                                               const void **restKeys)
-{
-    checkTPROState();
-    return gAPIs->_dyld_find_pointer_hash_table_entry(table, key1, restKeysCount, restKeys);
-}
-
-uint64_t dyld_get_program_sdk_version_token(void)
-{
-    checkTPROState();
-    return gAPIs->dyld_get_program_sdk_version_token();
-}
-
-uint64_t dyld_get_program_minos_version_token(void) {
-    checkTPROState();
-    return gAPIs->dyld_get_program_minos_version_token();
-}
-
-dyld_platform_t dyld_version_token_get_platform(uint64_t token) {
-    checkTPROState();
-    return gAPIs->dyld_version_token_get_platform(token);
-}
-
-bool dyld_version_token_at_least(uint64_t token, dyld_build_version_t version)
-{
-    checkTPROState();
-    return gAPIs->dyld_version_token_at_least(token, version);
-}
-
-void _dyld_stack_range(const void** stack_bottom, const void** stack_top)
-{
-    checkTPROState();
-    gAPIs->_dyld_stack_range(stack_bottom, stack_top);
-}
-
-void _dyld_for_each_prewarming_range(void (*callback)(const void* base, size_t size))
-{
-    checkTPROState();
-    gAPIs->_dyld_for_each_prewarming_range(callback);
-}
-
-
-void _dyld_call_with_writable_tpro_memory(void (*func)(void*), void* ctx) {
-    checkTPROState();
-    gAPIs->_dyld_call_with_writable_tpro_memory(func, ctx);
+    gDyld.apis->_dyld_after_fork_dlopen_child();
 }
 
 //
 // MARK: --- crt data symbols ---
 //
-int          NXArgc     = 0;
-const char** NXArgv     = nullptr;
-      char** environ    = nullptr;
-const char*  __progname = nullptr;
-
-//
-// MARK: --- dyld stack ---
-//
-const void* _dyld_stack_top = nullptr;
-const void* _dyld_stack_bottom = nullptr;
+int          NXArgc = 0;
+const char** NXArgv = NULL;
+      char** environ = NULL;
+const char*  __progname = NULL;
+