<pre style='margin:0'>
Chris Jones (cjones051073) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/345091d1a4478c0b74b675cd71e5617808dcee6a">https://github.com/macports/macports-legacy-support/commit/345091d1a4478c0b74b675cd71e5617808dcee6a</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 345091d1a4478c0b74b675cd71e5617808dcee6a
</span>Author: Marcus Calhoun-Lopez <marcuscalhounlopez@gmail.com>
AuthorDate: Fri Apr 8 23:37:45 2022 -0700

<span style='display:block; white-space:pre;color:#404040;'>    wrap _tlv_atexit and __cxa_thread_atexit
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    `__cxa_thread_atexit` exists in
</span><span style='display:block; white-space:pre;color:#404040;'>        MacPorts provided libc++ on 10.6 and earlier
</span><span style='display:block; white-space:pre;color:#404040;'>        libSystem.B.dylib on 10.8 and later
</span><span style='display:block; white-space:pre;color:#404040;'>        MacPorts provided libstdc++
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    `_tlv_atexit` exists in libSystem.B.dylib on 10.7 and later
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Upstream Clang uses `_tlv_atexit` on all Darwin systems.
</span><span style='display:block; white-space:pre;color:#404040;'>    MacPorts Clang uses `_tlv_atexit` on 10.6 and earlier.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    When MACOSX_DEPLOYMENT_TARGET is set, allow legacy-support library
</span><span style='display:block; white-space:pre;color:#404040;'>    to find the appropriate atexit function at runtime so the binary
</span><span style='display:block; white-space:pre;color:#404040;'>    can run on systems other than then one it was built on.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See https://github.com/macports/macports-ports/pull/14514
</span>---
 include/MacportsLegacySupport.h |  3 ++
 src/add_symbols.c               | 10 +++++
 src/macports_legacy_atexit.c    | 82 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/include/MacportsLegacySupport.h b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;color:#808080;'>index adc061f..a940412 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/include/MacportsLegacySupport.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -166,4 +166,7 @@
</span> /* copyfile and its associated functions have gained functionality over the years */
 #define __MP_LEGACY_SUPPORT_COPYFILE_WRAP__ (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/* _tlv_atexit and __cxa_thread_atexit */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define __MP_LEGACY_SUPPORT_ATEXIT_WRAP__  (__APPLE__ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #endif /* _MACPORTS_LEGACYSUPPORTDEFS_H_ */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/add_symbols.c b/src/add_symbols.c
</span><span style='display:block; white-space:pre;color:#808080;'>index ac754d7..59fb3fb 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/add_symbols.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/add_symbols.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -29,3 +29,13 @@ extern const char pthread_setname_np_tmp5 __asm("$ld$add$os10.5$_pthread_setname
</span> /* extern const char copyfile_state_get_tmp4 __asm("$ld$add$os10.4$_copyfile_state_get"); __attribute__((visibility("default"))) const char copyfile_state_get_tmp4 = 0; */
 extern const char copyfile_state_get_tmp5 __asm("$ld$add$os10.5$_copyfile_state_get"); __attribute__((visibility("default"))) const char copyfile_state_get_tmp5 = 0;
 #endif
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if !(__MP_LEGACY_SUPPORT_ATEXIT_WRAP__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char _tlv_atexit_tmp4 __asm("$ld$add$os10.4$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp4 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char _tlv_atexit_tmp5 __asm("$ld$add$os10.5$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp5 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char _tlv_atexit_tmp6 __asm("$ld$add$os10.6$__tlv_atexit"); __attribute__((visibility("default"))) const char _tlv_atexit_tmp6 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char __cxa_thread_atexit_tmp4 __asm("$ld$add$os10.4$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp4 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char __cxa_thread_atexit_tmp5 __asm("$ld$add$os10.5$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp5 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+extern const char __cxa_thread_atexit_tmp6 __asm("$ld$add$os10.6$___cxa_thread_atexit"); __attribute__((visibility("default"))) const char __cxa_thread_atexit_tmp6 = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports_legacy_atexit.c b/src/macports_legacy_atexit.c
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..6385426
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports_legacy_atexit.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,82 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2022
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Permission to use, copy, modify, and distribute this software for any
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * purpose with or without fee is hereby granted, provided that the above
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * copyright notice and this permission notice appear in all copies.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* MP support header */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "MacportsLegacySupport.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* _tlv_atexit wrap */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if __MP_LEGACY_SUPPORT_ATEXIT_WRAP__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <dlfcn.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* signature from https://opensource.apple.com/source/dyld/dyld-852.2/src/threadLocalVariables.c.auto.html */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void _tlv_atexit(void (*func)(void*), void* objAddr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    void (*real__tlv_atexit)(void (*func)(void*), void* objAddr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int (*real___cxa_thread_atexit)(void (*dtor)(void*), void* obj, void* dso_symbol);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    real__tlv_atexit = dlsym(RTLD_NEXT, "_tlv_atexit");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (real__tlv_atexit != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* _tlv_atexit exists in libSystem.B.dylib on 10.7 and later */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        real__tlv_atexit(func, objAddr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    real___cxa_thread_atexit = dlsym(RTLD_DEFAULT, "__cxa_thread_atexit");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (real___cxa_thread_atexit != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* __cxa_thread_atexit exists in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               MacPorts provided libc++ on 10.6 and earlier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               libSystem.B.dylib on 10.8 and later
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               MacPorts provided libstdc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           in all cases, third parameter (dso_handle) seems to be ignored
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   real___cxa_thread_atexit(func, objAddr, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit(EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* signature from https://github.com/llvm-mirror/libcxxabi/blob/master/src/cxa_thread_atexit.cpp */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int __cxa_thread_atexit(void (*dtor)(void*), void* obj, void* dso_symbol) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    void (*real__tlv_atexit)(void (*func)(void*), void* objAddr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int (*real___cxa_thread_atexit)(void (*dtor)(void*), void* obj, void* dso_symbol);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    real___cxa_thread_atexit = dlsym(RTLD_NEXT, "__cxa_thread_atexit");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (real___cxa_thread_atexit != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* __cxa_thread_atexit exists in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               MacPorts provided libc++ on 10.6 and earlier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               libSystem.B.dylib on 10.8 and later
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+               MacPorts provided libstdc++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return real___cxa_thread_atexit(dtor, obj, dso_symbol);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   real__tlv_atexit = dlsym(RTLD_DEFAULT, "_tlv_atexit");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if (real__tlv_atexit != NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* _tlv_atexit exists in libSystem.B.dylib on 10.7 and later
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           it seems to be common practice to ignore dso_symbol
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        real__tlv_atexit(dtor, obj);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit(EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif /*__MP_LEGACY_SUPPORT_ATEXIT_WRAP__*/
</span></pre><pre style='margin:0'>

</pre>