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

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/33e1b3f8f7af981256bf26c7eb6285f0d550f520">https://github.com/macports/macports-legacy-support/commit/33e1b3f8f7af981256bf26c7eb6285f0d550f520</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 33e1b3f8f7af981256bf26c7eb6285f0d550f520
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Oct 18 20:12:10 2024 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Rewrite symbol aliases test.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    The old symbol aliases test relied on looking up symbols with dlsym(),
</span><span style='display:block; white-space:pre;color:#404040;'>    which doesn't work with a statically-linked library.  This rewrites it
</span><span style='display:block; white-space:pre;color:#404040;'>    to use ordinary external references, which will fail if the referenced
</span><span style='display:block; white-space:pre;color:#404040;'>    symbols are missing.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This means that any errors are build-time errors rather than runtime
</span><span style='display:block; white-space:pre;color:#404040;'>    errors.  As noted in the comment, there's theoretically a way to avoid
</span><span style='display:block; white-space:pre;color:#404040;'>    that by using weak references, but we don't bother to wrestle with the
</span><span style='display:block; white-space:pre;color:#404040;'>    added complications of that approach.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'>    This version passes with both static and dynamic libraries.
</span>---
 test/test_symbol_aliases.c | 81 +++++++++++++++++++++++++++++++++++-----------
 1 file changed, 63 insertions(+), 18 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/test/test_symbol_aliases.c b/test/test_symbol_aliases.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 5d88b96..a6e0084 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/test/test_symbol_aliases.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/test/test_symbol_aliases.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,26 +1,71 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <dlfcn.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <assert.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</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:#ffe0e0;'>-int main()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     void (*fptr)();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * This provides tests to verify that certain symbol aliases are present.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Although there is probably a way to exploit weak references to defer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * errors until runtime, there are some complications with that approach,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * so we settle for simple external references, where failures are build
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * errors rather than runtime errors.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     // void __bzero(void *s, size_t n);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     fptr = dlsym(RTLD_DEFAULT, "__bzero");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     assert( fptr!=0 && "__bzero symbol does not exist");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Macro to avoid warnings converting pointer to ULL */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__LP64__) && __LP64__
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PTR2ULL(x) ((unsigned long long) (x))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define PTR2ULL(x) ((unsigned long long) (unsigned int) (x))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     // int dirfd(DIR *dirp);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     fptr = dlsym(RTLD_DEFAULT, "dirfd");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     assert( fptr!=0 && "dirfd symbol does not exist");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define BASE_SYMS \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  SYM_MAC(__bzero) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  SYM_MAC(dirfd)
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#if  __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 && !defined(__arm64__)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // int fstatat$INODE64(int dirfd, const char *pathname, struct stat64 *buf, int flags);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     fptr = dlsym(RTLD_DEFAULT, "fstatat$INODE64");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     assert( fptr!=0 && "fstatat$INODE64 symbol does not exist");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    && !defined(__arm64__)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #define CHECK_SYMS BASE_SYMS \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    SYM_MAC(fstatat$INODE64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  #define CHECK_SYMS BASE_SYMS
</span> #endif
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     printf("All symbol aliases found\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#define SYM_MAC(name) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  extern void name(); \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  void *name##_adr = &name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CHECK_SYMS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#undef SYM_MAC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+main(int argc, char *argv[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  int verbose = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (argc > 1 && !strcmp(argv[1], "-v")) verbose = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  if (verbose) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #define SYM_MAC(name) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      printf(" " #name " = %llX\n", PTR2ULL(name##_adr));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    CHECK_SYMS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    #undef SYM_MAC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  }
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  printf("symbol aliases test passed.\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+  return 0;
</span> }
</pre><pre style='margin:0'>

</pre>