--- a/configure.ac
+++ b/configure.ac
@@ -44,6 +44,7 @@ fi
 
 AC_CONFIG_AUX_DIR([config])
 AC_CONFIG_FILES([config/Makefile])
+AC_CONFIG_FILES([libgnu/Makefile])
 
 AC_COPYRIGHT([Copyright (C) 1996-2024 The elfutils developers.])
 AC_PREREQ(2.63)			dnl Minimum Autoconf version required.
@@ -88,11 +89,14 @@ AS_IF([test "$use_locks" = yes],
 
 AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.])
 
+AC_USE_SYSTEM_EXTENSIONS()
+
 m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_C99])
 AC_PROG_CXX
 AC_PROG_RANLIB
 AC_PROG_YACC
 AC_PROG_LEX([noyywrap])
+gl_EARLY
 # Only available since automake 1.12
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
 AC_CHECK_TOOL([READELF], [readelf])
@@ -646,6 +650,8 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
 CFLAGS="$old_CFLAGS"])
 AS_IF([test "x$ac_cv_fno_addrsig" = "xyes"], CFLAGS="$CFLAGS -fno-addrsig")
 
+gl_INIT
+
 saved_LIBS="$LIBS"
 AC_SEARCH_LIBS([argp_parse], [argp])
 LIBS="$saved_LIBS"
--- a/lib/eu-config.h
+++ b/lib/eu-config.h
@@ -31,14 +31,19 @@
 
 #include "locks.h"
 
-#include <libintl.h>
+#include <gettext.h>
 /* gettext helper macros.  */
 #define N_(Str) Str
 #define _(Str) dgettext ("elfutils", Str)
 
 /* Compiler-specific definitions.  */
+#define __PRAGMA(str) _Pragma (#str)
+#ifdef __APPLE__
+#define strong_alias(name, aliasname) __PRAGMA(weak aliasname = name)
+#else
 #define strong_alias(name, aliasname) \
   extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+#endif
 
 #ifdef __i386__
 # define internal_function __attribute__ ((regparm (3), stdcall))
@@ -49,7 +54,7 @@
 #define internal_strong_alias(name, aliasname) \
   extern __typeof (name) aliasname __attribute__ ((alias (#name))) internal_function;
 
-#ifdef HAVE_VISIBILITY
+#if defined(HAVE_VISIBILITY) && !defined(__APPLE__)
 #define attribute_hidden \
   __attribute__ ((visibility ("hidden")))
 #else
@@ -138,7 +143,7 @@ asm (".section predict_data, \"aw\"; .pr
 #endif
 
 /* Avoid PLT entries.  */
-#ifdef PIC
+#if defined(PIC) && !defined(__APPLE__)
 # define INTUSE(name) _INTUSE(name)
 # define _INTUSE(name) __##name##_internal
 # define INTDEF(name) _INTDEF(name)
--- a/backends/i386_auxv.c
+++ b/backends/i386_auxv.c
@@ -48,5 +48,4 @@ EBLHOOK(auxv_info) (GElf_Xword a_type, c
   return 1;
 }
 
-__typeof (i386_auxv_info) x86_64_auxv_info
-			  __attribute__ ((alias ("i386_auxv_info")));
+auxv_info_alias(x86_64)
--- a/backends/ppc_regs.c
+++ b/backends/ppc_regs.c
@@ -204,5 +204,11 @@ ppc_register_info (Ebl *ebl __attribute_
   return namelen;
 }
 
-__typeof (ppc_register_info)
-     ppc64_register_info __attribute__ ((alias ("ppc_register_info")));
+ssize_t
+ppc64_register_info (Ebl *ebl,
+		     int regno, char *name, size_t namelen,
+		     const char **prefix, const char **setname,
+		     int *bits, int *type)
+{
+  return ppc_register_info(ebl, regno, name, namelen, prefix, setname, bits, type);
+}
--- a/backends/libebl_CPU.h
+++ b/backends/libebl_CPU.h
@@ -97,4 +97,10 @@ dwarf_is_pointer (int tag)
   case DW_TAG_reference_type: \
   case DW_TAG_rvalue_reference_type
 
+#define auxv_info_alias(arch) \
+	int EBLHOOK_1(arch ## _, auxv_info) (GElf_Xword a_type, const char **name, const char **format) \
+	{ \
+		return EBLHOOK(auxv_info)(a_type, name, format); \
+	}
+
 #endif	/* libebl_CPU.h */
--- a/backends/ppc_auxv.c
+++ b/backends/ppc_auxv.c
@@ -51,5 +51,4 @@ EBLHOOK(auxv_info) (GElf_Xword a_type, c
   return 1;
 }
 
-__typeof (ppc_auxv_info) ppc64_auxv_info
-			 __attribute__ ((alias ("ppc_auxv_info")));
+auxv_info_alias(ppc64)
--- a/backends/ppc_cfi.c
+++ b/backends/ppc_cfi.c
@@ -72,6 +72,7 @@ ppc_abi_cfi (Ebl *ebl __attribute__ ((un
   return 0;
 }
 
-__typeof (ppc_abi_cfi)
-     ppc64_abi_cfi
-     __attribute__ ((alias ("ppc_abi_cfi")));
+int ppc64_abi_cfi(Ebl *ebl, Dwarf_CIE *abi_info)
+{
+  return ppc_abi_cfi(ebl, abi_info);
+}
--- a/backends/ppc_initreg.c
+++ b/backends/ppc_initreg.c
@@ -68,9 +68,10 @@ ppc_dwarf_to_regno (Ebl *ebl __attribute
   abort ();
 }
 
-__typeof (ppc_dwarf_to_regno)
-     ppc64_dwarf_to_regno
-     __attribute__ ((alias ("ppc_dwarf_to_regno")));
+bool ppc64_dwarf_to_regno (Ebl *ebl, unsigned *regno)
+{
+  return ppc_dwarf_to_regno(ebl, regno);
+}
 
 bool
 ppc_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
@@ -127,6 +128,7 @@ ppc_set_initial_registers_tid (pid_t tid
 #endif /* __powerpc__ */
 }
 
-__typeof (ppc_set_initial_registers_tid)
-     ppc64_set_initial_registers_tid
-     __attribute__ ((alias ("ppc_set_initial_registers_tid")));
+bool ppc64_set_initial_registers_tid(pid_t tid, ebl_tid_registers_t *setfunc, void *arg)
+{
+  return ppc_set_initial_registers_tid(tid, setfunc, arg);
+}
--- a/backends/ppc_attrs.c
+++ b/backends/ppc_attrs.c
@@ -81,6 +81,9 @@ ppc_check_object_attribute (Ebl *ebl __a
   return false;
 }
 
-__typeof (ppc_check_object_attribute)
-     ppc64_check_object_attribute
-     __attribute__ ((alias ("ppc_check_object_attribute")));
+bool ppc64_check_object_attribute(Ebl *ebl,
+				  const char *vendor, int tag, uint64_t value,
+				  const char **tag_name, const char **value_name)
+{
+  return ppc_check_object_attribute(ebl, vendor, tag, value, tag_name, value_name);
+}
--- a/libdwfl/libdwflP.h
+++ b/libdwfl/libdwflP.h
@@ -31,6 +31,7 @@
 
 #include <libdwfl.h>
 #include <libebl.h>
+#include <libeu.h>
 #include <assert.h>
 #include <dirent.h>
 #include <errno.h>
--- /dev/null
+++ b/lib/stdio_ext.h
@@ -0,0 +1,6 @@
+#include <stdio.h>
+#ifndef __APPLE__
+#include_next <stdio_ext.h>
+#else
+#define __fsetlocking(...) 0
+#endif
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -32,6 +32,7 @@
 #include <stdbool.h>
 #include <pthread.h>
 
+#include <libeu.h>
 #include <libdw.h>
 #include <dwarf.h>
 #include "eu-search.h"
--- a/config/libdebuginfod.pc.in
+++ b/config/libdebuginfod.pc.in
@@ -8,5 +8,5 @@ Description: elfutils library to query d
 Version: @VERSION@
 URL: http://elfutils.org/
 
-Libs: -L${libdir} -ldebuginfod
+Libs: -L${libdir} -ldebuginfod -lpthread
 Cflags: -I${includedir}
--- a/config/libdw.pc.in
+++ b/config/libdw.pc.in
@@ -8,7 +8,7 @@ Description: elfutils library for DWARF
 Version: @VERSION@
 URL: http://elfutils.org/
 
-Libs: -L${libdir} -ldw
+Libs: -L${libdir} -ldw -lz -lelf -lz -ldl -lpthread
 Cflags: -I${includedir}
 
 # We need the exact matching elfutils libelf version since internal data
--- a/config/libelf.pc.in
+++ b/config/libelf.pc.in
@@ -8,7 +8,7 @@ Description: elfutils libelf library to
 Version: @VERSION@
 URL: http://elfutils.org/
 
-Libs: -L${libdir} -lelf
+Libs: -L${libdir} -lelf -lz
 Cflags: -I${includedir}
 
 Requires.private: zlib @LIBZSTD@
--- a/libebl/eblopenbackend.c
+++ b/libebl/eblopenbackend.c
@@ -202,8 +202,6 @@ static bool default_object_note (const c
 				 uint32_t descsz, const char *desc);
 static bool default_debugscn_p (const char *name);
 static bool default_copy_reloc_p (int reloc);
-static bool default_none_reloc_p (int reloc);
-static bool default_relative_reloc_p (int reloc);
 static bool default_check_special_symbol (Elf *elf,
 					  const GElf_Sym *sym,
 					  const char *name,
@@ -255,8 +253,8 @@ fill_defaults (Ebl *result)
   result->object_note = default_object_note;
   result->debugscn_p = default_debugscn_p;
   result->copy_reloc_p = default_copy_reloc_p;
-  result->none_reloc_p = default_none_reloc_p;
-  result->relative_reloc_p = default_relative_reloc_p;
+  result->none_reloc_p = default_copy_reloc_p;
+  result->relative_reloc_p = default_copy_reloc_p;
   result->check_special_symbol = default_check_special_symbol;
   result->data_marker_symbol = default_data_marker_symbol;
   result->check_st_other_bits = default_check_st_other_bits;
@@ -638,8 +636,6 @@ default_copy_reloc_p (int reloc __attrib
 {
   return false;
 }
-strong_alias (default_copy_reloc_p, default_none_reloc_p)
-strong_alias (default_copy_reloc_p, default_relative_reloc_p)
 
 static bool
 default_check_special_symbol (Elf *elf __attribute__ ((unused)),
