Loading...
libdyld/LibSystemHelpers.cpp dyld-1340 dyld-1231.3
--- dyld/dyld-1340/libdyld/LibSystemHelpers.cpp
+++ dyld/dyld-1231.3/libdyld/LibSystemHelpers.cpp
@@ -59,24 +59,17 @@
 #include "LibSystemHelpers.h"
 #include "DyldProcessConfig.h"
 #include "DyldAPIs.h"
-#include "ThreadLocalVariables.h"
-
-extern "C" struct mach_header __dso_handle; // mach_header of libdyld.dylib
+
+// implemented in assembly
+extern "C" void* tlv_get_addr(dyld3::MachOAnalyzer::TLV_Thunk*);
+
+uint8_t dyld_process_has_objc_patches = 0;
 
 namespace dyld4 {
-    extern class APIs* gAPIs;
-}
-
-extern void _dyld_make_delayed_module_initializer_calls();
-
-
-uint8_t dyld_process_has_objc_patches = 0;
-
-namespace dyld4 {
 
 uintptr_t LibSystemHelpers::version() const
 {
-    return 7;
+    return 6;
 }
 
 void* LibSystemHelpers::malloc(size_t size) const
@@ -96,7 +89,7 @@
 
 kern_return_t LibSystemHelpers::vm_allocate(vm_map_t task, vm_address_t* address, vm_size_t size, int flags) const
 {
-#if !DYLD_FEATURE_EMBEDDED_PAGE_ALLOCATOR
+#if !TARGET_OS_EXCLAVEKIT
     return ::vm_allocate(task, address, size, flags);
 #else
     //TODO: EXCLAVES. Then replace calls to MemoryManager::allocate_pages
@@ -116,7 +109,20 @@
 // Note: driverkit uses a different arm64e ABI, so we cannot call libSystem's pthread_key_create() from dyld
 int LibSystemHelpers::pthread_key_create_free(dyld_thread_key_t* key) const
 {
-    return dyld_thread_key_create(key, &::free);
+#if TARGET_OS_EXCLAVEKIT
+    return ::tss_create(key, &::free);
+#else
+    return ::pthread_key_create(key, &::free);
+#endif
+}
+
+int LibSystemHelpers::pthread_key_init_free(int key) const
+{
+#if TARGET_OS_EXCLAVEKIT
+    return 0; // ::tss_create already sets up the destructor;
+#else
+    return ::pthread_key_init_np(key, &::free);
+#endif
 }
 
 void LibSystemHelpers::run_async(void* (*func)(void*), void* context) const
@@ -132,9 +138,29 @@
 #endif
 }
 
+static void finalizeListTLV_thunk(void* list)
+{
+    // Called by pthreads when the current thread is going away
+    gDyld.apis->_finalizeListTLV(list);
+}
+
+// Note: driverkit uses a different arm64e ABI, so we cannot call libSystem's pthread_key_create() from dyld
+int LibSystemHelpers::pthread_key_create_thread_exit(dyld_thread_key_t* key) const
+{
+#if TARGET_OS_EXCLAVEKIT
+    return ::tss_create(key, &finalizeListTLV_thunk);
+#else
+    return ::pthread_key_create(key, &finalizeListTLV_thunk);
+#endif
+}
+
 void* LibSystemHelpers::pthread_getspecific(dyld_thread_key_t key) const
 {
-    return dyld_thread_getspecific(key);
+#if TARGET_OS_EXCLAVEKIT
+    return ::tss_get(key);
+#else
+    return ::pthread_getspecific(key);
+#endif
 }
 
 int LibSystemHelpers::pthread_setspecific(dyld_thread_key_t key, const void* value) const
@@ -217,6 +243,11 @@
 #endif
 }
 
+LibSystemHelpers::TLVGetAddrFunc LibSystemHelpers::getTLVGetAddrFunc() const
+{
+    return &::tlv_get_addr;
+}
+
 // Added in version 2
 
 void LibSystemHelpers::os_unfair_recursive_lock_unlock_forked_child(dyld_recursive_mutex_t lock) const
@@ -251,65 +282,5 @@
 #endif
 }
 
-// Added in version 7
-
-
-static bool 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;
-}
-
-void LibSystemHelpers::setDefaultProgramVars(ProgramVars& vars) const
-{
-    vars.__prognamePtr = &__progname;
-#if !TARGET_OS_EXCLAVEKIT
-    vars.NXArgcPtr  = &NXArgc;
-    vars.NXArgvPtr  = &NXArgv;
-    vars.environPtr = (const char***)&environ;
-#endif
-}
-
-
-FuncLookup LibSystemHelpers::legacyDyldFuncLookup() const
-{
-    return &legacyDyldLookup4OldBinaries;
-}
-
-mach_o::Error LibSystemHelpers::setUpThreadLocals(const DyldSharedCache* cache, const Header* hdr) const
-{
-    return dyld::sThreadLocalVariables.setUpImage(cache, hdr);
-}
-
-
 } // namespace dyld4