Commit e0976d7e909382fa4924879f3bdfd9ee1b4549a3

Guillem Jover 2023-04-02T22:33:25

build: Add a new libbsd_strong_alias() macro and switch users to it We had several cases of code needing a strong alias, so we switch those to use the new macro. This covers systems that support the alias attribute and others such as macOS where we need to use assembler directives to add the alias as the attribute is not supported.

diff --git a/src/local-link.h b/src/local-link.h
index 7e9053b..a05d5ed 100644
--- a/src/local-link.h
+++ b/src/local-link.h
@@ -37,6 +37,16 @@
 #define libbsd_link_warning(symbol, msg)
 #endif
 
+#if defined(__APPLE__)
+#define libbsd_strong_alias(alias, symbol) \
+	__asm__(".globl _" #alias); \
+	__asm__(".set _" #alias ", _" #symbol); \
+	extern __typeof(symbol) alias
+#elif !defined(_MSC_VER)
+#define libbsd_strong_alias(alias, symbol) \
+	extern __typeof__(symbol) alias __attribute__((__alias__(#symbol)))
+#endif
+
 #ifdef __ELF__
 #  if __has_attribute(symver)
 /* The symver attribute is supported since gcc 10.x. */
@@ -64,7 +74,7 @@
 #  endif
 #else
 #define libbsd_symver_default(alias, symbol, version) \
-	extern __typeof__(symbol) alias __attribute__((__alias__(#symbol)))
+	libbsd_strong_alias(alias, symbol)
 
 #define libbsd_symver_variant(alias, symbol, version)
 
diff --git a/src/setproctitle.c b/src/setproctitle.c
index 64ff92a..3aff064 100644
--- a/src/setproctitle.c
+++ b/src/setproctitle.c
@@ -295,10 +295,8 @@ libbsd_symver_default(setproctitle, setproctitle_impl, LIBBSD_0.5);
  * in 0.5, make the implementation available in the old version as an alias
  * for code linking against that version, and change the default to use the
  * new version, so that new code depends on the implemented version. */
-#ifdef HAVE_TYPEOF
-extern __typeof__(setproctitle_impl)
-setproctitle_stub
-	__attribute__((__alias__("setproctitle_impl")));
+#if defined(libbsd_strong_alias)
+libbsd_strong_alias(setproctitle_stub, setproctitle_impl);
 #else
 void
 setproctitle_stub(const char *fmt, ...)