diff mbox series

[PATCHv2] libunwind: update to 1.4.0

Message ID 20200728202524.11424-1-rosenp@gmail.com
State Superseded
Headers show
Series [PATCHv2] libunwind: update to 1.4.0 | expand

Commit Message

Rosen Penev July 28, 2020, 8:25 p.m. UTC
Cleanup Makefile for consistency with other ones.

Remove PKG_SSP. It can be fixed with -lssp_nonshared.

Add PKG_BUILD_PARALLEL for faster compilation.

Add some alpine pathes to fix potential issues.

Backport GCC 10 patch to fix compilation.

Remove the InstallDev section for ARC. libunwind does not support ARC
and fails to compile. It seems InstallDev ignores the !arc DEPENDS.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
 v2: removed InstallDev for ARC
 package/libs/libunwind/Makefile               |  17 +-
 ...03-fix-missing-ef_reg-defs-with-musl.patch |   2 +-
 .../patches/005-aarch64-sigset_t.patch        |  21 +
 .../patches/006-fix-libunwind-pc-in.patch     |  10 +
 .../libs/libunwind/patches/010-gcc10.patch    | 442 ++++++++++++++++++
 5 files changed, 484 insertions(+), 8 deletions(-)
 create mode 100644 package/libs/libunwind/patches/005-aarch64-sigset_t.patch
 create mode 100644 package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
 create mode 100644 package/libs/libunwind/patches/010-gcc10.patch

Comments

Yousong Zhou July 29, 2020, 1:57 a.m. UTC | #1
On Wed, 29 Jul 2020 at 04:29, Rosen Penev <rosenp@gmail.com> wrote:
>
> Cleanup Makefile for consistency with other ones.
>
> Remove PKG_SSP. It can be fixed with -lssp_nonshared.
>
> Add PKG_BUILD_PARALLEL for faster compilation.
>
> Add some alpine pathes to fix potential issues.

This is just too vague and random.  What are those potential issues?
Add some description patch description what's wrong and why we need
them, to make it more clear in the future when we can get rid of them!

>
> Backport GCC 10 patch to fix compilation.
>
> Remove the InstallDev section for ARC. libunwind does not support ARC
> and fails to compile. It seems InstallDev ignores the !arc DEPENDS.

Likely it's not caused by InstallDev, reasons given in
https://github.com/openwrt/packages/pull/12959#issuecomment-665021413

Regards,
                yousong
>
> Signed-off-by: Rosen Penev <rosenp@gmail.com>
> ---
>  v2: removed InstallDev for ARC
>  package/libs/libunwind/Makefile               |  17 +-
>  ...03-fix-missing-ef_reg-defs-with-musl.patch |   2 +-
>  .../patches/005-aarch64-sigset_t.patch        |  21 +
>  .../patches/006-fix-libunwind-pc-in.patch     |  10 +
>  .../libs/libunwind/patches/010-gcc10.patch    | 442 ++++++++++++++++++
>  5 files changed, 484 insertions(+), 8 deletions(-)
>  create mode 100644 package/libs/libunwind/patches/005-aarch64-sigset_t.patch
>  create mode 100644 package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
>  create mode 100644 package/libs/libunwind/patches/010-gcc10.patch
>
> diff --git a/package/libs/libunwind/Makefile b/package/libs/libunwind/Makefile
> index 994ee97a17..b0bf75077b 100644
> --- a/package/libs/libunwind/Makefile
> +++ b/package/libs/libunwind/Makefile
> @@ -9,22 +9,22 @@
>  include $(TOPDIR)/rules.mk
>
>  PKG_NAME:=libunwind
> -PKG_VERSION:=1.3.1
> +PKG_VERSION:=1.4.0
>  PKG_RELEASE:=1
>
>  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
>  PKG_SOURCE_URL:=@SAVANNAH/$(PKG_NAME)
> -PKG_HASH:=43997a3939b6ccdf2f669b50fdb8a4d3205374728c2923ddc2354c65260214f8
> -PKG_FIXUP:=autoreconf
> -PKG_INSTALL:=1
> +PKG_HASH:=df59c931bd4d7ebfd83ee481c943edf015138089b8e50abed8d9c57ba9338435
>
> +PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
>  PKG_LICENSE:=X11
>  PKG_LICENSE_FILES:=LICENSE
>  PKG_CPE_ID:=cpe:/a:libunwind_project:libunwind
>
> -PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
> +PKG_FIXUP:=autoreconf
> +PKG_INSTALL:=1
> +PKG_BUILD_PARALLEL:=1
>
> -PKG_SSP:=0
>  include $(INCLUDE_DIR)/package.mk
>
>  define Package/libunwind
> @@ -43,19 +43,22 @@ endef
>  CONFIGURE_ARGS += \
>         --disable-documentation \
>         --disable-tests \
> -       --enable-minidebuginfo=no \
> +       --disable-minidebuginfo
>
> +TARGET_LDFLAGS += $(if $(CONFIG_USE_MUSL),-lssp_nonshared)
>
>  define Package/libunwind/install
>         $(INSTALL_DIR) $(1)/usr/lib
>         $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so.* $(1)/usr/lib/
>  endef
>
> +ifeq ($(CONFIG_arc),)
>  define Build/InstallDev
>         $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
>         $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include
>         $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so* $(1)/usr/lib
>         $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
>  endef
> +endif
>
>  $(eval $(call BuildPackage,libunwind))
> diff --git a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> index 465abb4ce0..479004a27e 100644
> --- a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> +++ b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> @@ -1,7 +1,7 @@
>  diff -uprN a/include/libunwind-mips.h b/include/libunwind-mips.h
>  --- a/include/libunwind-mips.h 2012-10-06 12:54:38.000000000 +0800
>  +++ b/include/libunwind-mips.h 2016-06-08 13:55:55.029436442 +0800
> -@@ -111,6 +111,42 @@ typedef enum
> +@@ -114,6 +114,42 @@ typedef enum
>     }
>   mips_regnum_t;
>
> diff --git a/package/libs/libunwind/patches/005-aarch64-sigset_t.patch b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
> new file mode 100644
> index 0000000000..7abc61c41a
> --- /dev/null
> +++ b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
> @@ -0,0 +1,21 @@
> +diff --git a/include/libunwind-aarch64.h b/include/libunwind-aarch64.h
> +index 778b436..926fbbc 100644
> +--- a/include/libunwind-aarch64.h
> ++++ b/include/libunwind-aarch64.h
> +@@ -34,6 +34,7 @@ extern "C" {
> + #include <inttypes.h>
> + #include <stddef.h>
> + #include <ucontext.h>
> ++#include <signal.h>
> +
> + #define UNW_TARGET      aarch64
> + #define UNW_TARGET_AARCH64      1
> +@@ -192,7 +193,7 @@ typedef struct
> +       unsigned long uc_flags;
> +       struct ucontext *uc_link;
> +       stack_t uc_stack;
> +-      __sigset_t uc_sigmask;
> ++      sigset_t uc_sigmask;
> +       struct unw_sigcontext uc_mcontext;
> +   } unw_tdep_context_t;
> +
> diff --git a/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
> new file mode 100644
> index 0000000000..ce93df4fad
> --- /dev/null
> +++ b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
> @@ -0,0 +1,10 @@
> +--- a/src/unwind/libunwind.pc.in
> ++++ b/src/unwind/libunwind.pc.in
> +@@ -6,6 +6,6 @@
> + Name: libunwind
> + Description: libunwind base library
> + Version: @VERSION@
> +-Libs: -L${libdir} -lunwind
> ++Libs: -L${libdir} -lunwind -lucontext
> + Libs.private: @LIBLZMA@
> + Cflags: -I${includedir}
> diff --git a/package/libs/libunwind/patches/010-gcc10.patch b/package/libs/libunwind/patches/010-gcc10.patch
> new file mode 100644
> index 0000000000..8b4801c175
> --- /dev/null
> +++ b/package/libs/libunwind/patches/010-gcc10.patch
> @@ -0,0 +1,442 @@
> +From 29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e Mon Sep 17 00:00:00 2001
> +From: Yichao Yu <yyc1992@gmail.com>
> +Date: Tue, 31 Mar 2020 00:43:32 -0400
> +Subject: [PATCH] Fix compilation with -fno-common.
> +
> +Making all other archs consistent with IA64 which should not have this problem.
> +Also move the FIXME to the correct place.
> +
> +Also add some minimum comments about this...
> +---
> + src/aarch64/Ginit.c                        | 15 +++++++--------
> + src/arm/Ginit.c                            | 15 +++++++--------
> + src/coredump/_UPT_get_dyn_info_list_addr.c |  5 +++++
> + src/hppa/Ginit.c                           | 15 +++++++--------
> + src/ia64/Ginit.c                           |  1 +
> + src/mi/Gfind_dynamic_proc_info.c           |  1 +
> + src/mips/Ginit.c                           | 15 +++++++--------
> + src/ppc32/Ginit.c                          | 11 +++++++----
> + src/ppc64/Ginit.c                          | 11 +++++++----
> + src/ptrace/_UPT_get_dyn_info_list_addr.c   |  5 +++++
> + src/s390x/Ginit.c                          | 15 +++++++--------
> + src/sh/Ginit.c                             | 15 +++++++--------
> + src/tilegx/Ginit.c                         | 15 +++++++--------
> + src/x86/Ginit.c                            | 15 +++++++--------
> + src/x86_64/Ginit.c                         | 15 +++++++--------
> + 15 files changed, 89 insertions(+), 80 deletions(-)
> +
> +diff --git a/src/aarch64/Ginit.c b/src/aarch64/Ginit.c
> +index dec235c82..35389762f 100644
> +--- a/src/aarch64/Ginit.c
> ++++ b/src/aarch64/Ginit.c
> +@@ -61,13 +61,6 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -78,7 +71,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/arm/Ginit.c b/src/arm/Ginit.c
> +index 2720d063a..0bac0d72d 100644
> +--- a/src/arm/Ginit.c
> ++++ b/src/arm/Ginit.c
> +@@ -57,18 +57,17 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/coredump/_UPT_get_dyn_info_list_addr.c
> +index 0d1190556..739ed0569 100644
> +--- a/src/coredump/_UPT_get_dyn_info_list_addr.c
> ++++ b/src/coredump/_UPT_get_dyn_info_list_addr.c
> +@@ -74,6 +74,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> +
> + #else
> +
> ++/* XXX fix me: there is currently no way to locate the dyn-info list
> ++       by a remote unwinder.  On ia64, this is done via a special
> ++       unwind-table entry.  Perhaps something similar can be done with
> ++       DWARF2 unwind info.  */
> ++
> + static inline int
> + get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> +                int *countp)
> +diff --git a/src/hppa/Ginit.c b/src/hppa/Ginit.c
> +index 461e4b93d..265455a68 100644
> +--- a/src/hppa/Ginit.c
> ++++ b/src/hppa/Ginit.c
> +@@ -64,13 +64,6 @@ _Uhppa_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -81,7 +74,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/ia64/Ginit.c b/src/ia64/Ginit.c
> +index b09a2ad57..8601bb3ca 100644
> +--- a/src/ia64/Ginit.c
> ++++ b/src/ia64/Ginit.c
> +@@ -68,6 +68,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +   if (!_U_dyn_info_list_addr)
> +     return -UNW_ENOINFO;
> + #endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> +   *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +diff --git a/src/mi/Gfind_dynamic_proc_info.c b/src/mi/Gfind_dynamic_proc_info.c
> +index 98d350128..2e7c62e5e 100644
> +--- a/src/mi/Gfind_dynamic_proc_info.c
> ++++ b/src/mi/Gfind_dynamic_proc_info.c
> +@@ -49,6 +49,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
> +     return -UNW_ENOINFO;
> + #endif
> +
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> +   list = (unw_dyn_info_list_t *) (uintptr_t) _U_dyn_info_list_addr ();
> +   for (di = list->first; di; di = di->next)
> +     if (ip >= di->start_ip && ip < di->end_ip)
> +diff --git a/src/mips/Ginit.c b/src/mips/Ginit.c
> +index 3df170c75..bf7a8f5a8 100644
> +--- a/src/mips/Ginit.c
> ++++ b/src/mips/Ginit.c
> +@@ -69,13 +69,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -86,7 +79,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/ppc32/Ginit.c b/src/ppc32/Ginit.c
> +index ba302448a..7b4545580 100644
> +--- a/src/ppc32/Ginit.c
> ++++ b/src/ppc32/Ginit.c
> +@@ -96,9 +96,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -109,7 +106,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/ppc64/Ginit.c b/src/ppc64/Ginit.c
> +index 4c88cd6e7..7bfb395a7 100644
> +--- a/src/ppc64/Ginit.c
> ++++ b/src/ppc64/Ginit.c
> +@@ -95,9 +95,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -108,7 +105,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/ptrace/_UPT_get_dyn_info_list_addr.c b/src/ptrace/_UPT_get_dyn_info_list_addr.c
> +index cc5ed0441..16671d453 100644
> +--- a/src/ptrace/_UPT_get_dyn_info_list_addr.c
> ++++ b/src/ptrace/_UPT_get_dyn_info_list_addr.c
> +@@ -71,6 +71,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> +
> + #else
> +
> ++/* XXX fix me: there is currently no way to locate the dyn-info list
> ++       by a remote unwinder.  On ia64, this is done via a special
> ++       unwind-table entry.  Perhaps something similar can be done with
> ++       DWARF2 unwind info.  */
> ++
> + static inline int
> + get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> +                int *countp)
> +diff --git a/src/s390x/Ginit.c b/src/s390x/Ginit.c
> +index f0886ac93..db01743c0 100644
> +--- a/src/s390x/Ginit.c
> ++++ b/src/s390x/Ginit.c
> +@@ -50,8 +50,6 @@ static struct unw_addr_space local_addr_space;
> +
> + unw_addr_space_t unw_local_addr_space = &local_addr_space;
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> + static inline void *
> + uc_addr (ucontext_t *uc, int reg)
> + {
> +@@ -75,11 +73,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -90,7 +83,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/sh/Ginit.c b/src/sh/Ginit.c
> +index 52988a721..9fe96d2bd 100644
> +--- a/src/sh/Ginit.c
> ++++ b/src/sh/Ginit.c
> +@@ -58,13 +58,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -75,7 +68,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/tilegx/Ginit.c b/src/tilegx/Ginit.c
> +index 7564a558b..925e64132 100644
> +--- a/src/tilegx/Ginit.c
> ++++ b/src/tilegx/Ginit.c
> +@@ -64,13 +64,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -81,7 +74,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/x86/Ginit.c b/src/x86/Ginit.c
> +index f6b8dc27d..3cec74a21 100644
> +--- a/src/x86/Ginit.c
> ++++ b/src/x86/Ginit.c
> +@@ -54,13 +54,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> +
> + # endif /* UNW_LOCAL_ONLY */
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -71,7 +64,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> +diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
> +index a865d3385..fd8d418b1 100644
> +--- a/src/x86_64/Ginit.c
> ++++ b/src/x86_64/Ginit.c
> +@@ -49,13 +49,6 @@ static struct unw_addr_space local_addr_space;
> +
> + unw_addr_space_t unw_local_addr_space = &local_addr_space;
> +
> +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> +-
> +-/* XXX fix me: there is currently no way to locate the dyn-info list
> +-       by a remote unwinder.  On ia64, this is done via a special
> +-       unwind-table entry.  Perhaps something similar can be done with
> +-       DWARF2 unwind info.  */
> +-
> + static void
> + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> + {
> +@@ -66,7 +59,13 @@ static int
> + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> +                         void *arg)
> + {
> +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> ++#ifndef UNW_LOCAL_ONLY
> ++# pragma weak _U_dyn_info_list_addr
> ++  if (!_U_dyn_info_list_addr)
> ++    return -UNW_ENOINFO;
> ++#endif
> ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> +   return 0;
> + }
> +
> --
> 2.26.2
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Rosen Penev July 29, 2020, 3:55 a.m. UTC | #2
On Tue, Jul 28, 2020 at 6:57 PM Yousong Zhou <yszhou4tech@gmail.com> wrote:
>
> On Wed, 29 Jul 2020 at 04:29, Rosen Penev <rosenp@gmail.com> wrote:
> >
> > Cleanup Makefile for consistency with other ones.
> >
> > Remove PKG_SSP. It can be fixed with -lssp_nonshared.
> >
> > Add PKG_BUILD_PARALLEL for faster compilation.
> >
> > Add some alpine pathes to fix potential issues.
>
> This is just too vague and random.  What are those potential issues?
> Add some description patch description what's wrong and why we need
> them, to make it more clear in the future when we can get rid of them!
Sure.
>
> >
> > Backport GCC 10 patch to fix compilation.
> >
> > Remove the InstallDev section for ARC. libunwind does not support ARC
> > and fails to compile. It seems InstallDev ignores the !arc DEPENDS.
>
> Likely it's not caused by InstallDev, reasons given in
> https://github.com/openwrt/packages/pull/12959#issuecomment-665021413
I'm not talking about openvswitch. I'm talking about
https://downloads.openwrt.org/snapshots/faillogs/arc_archs/base/libunwind/compile.txt
>
> Regards,
>                 yousong
> >
> > Signed-off-by: Rosen Penev <rosenp@gmail.com>
> > ---
> >  v2: removed InstallDev for ARC
> >  package/libs/libunwind/Makefile               |  17 +-
> >  ...03-fix-missing-ef_reg-defs-with-musl.patch |   2 +-
> >  .../patches/005-aarch64-sigset_t.patch        |  21 +
> >  .../patches/006-fix-libunwind-pc-in.patch     |  10 +
> >  .../libs/libunwind/patches/010-gcc10.patch    | 442 ++++++++++++++++++
> >  5 files changed, 484 insertions(+), 8 deletions(-)
> >  create mode 100644 package/libs/libunwind/patches/005-aarch64-sigset_t.patch
> >  create mode 100644 package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
> >  create mode 100644 package/libs/libunwind/patches/010-gcc10.patch
> >
> > diff --git a/package/libs/libunwind/Makefile b/package/libs/libunwind/Makefile
> > index 994ee97a17..b0bf75077b 100644
> > --- a/package/libs/libunwind/Makefile
> > +++ b/package/libs/libunwind/Makefile
> > @@ -9,22 +9,22 @@
> >  include $(TOPDIR)/rules.mk
> >
> >  PKG_NAME:=libunwind
> > -PKG_VERSION:=1.3.1
> > +PKG_VERSION:=1.4.0
> >  PKG_RELEASE:=1
> >
> >  PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
> >  PKG_SOURCE_URL:=@SAVANNAH/$(PKG_NAME)
> > -PKG_HASH:=43997a3939b6ccdf2f669b50fdb8a4d3205374728c2923ddc2354c65260214f8
> > -PKG_FIXUP:=autoreconf
> > -PKG_INSTALL:=1
> > +PKG_HASH:=df59c931bd4d7ebfd83ee481c943edf015138089b8e50abed8d9c57ba9338435
> >
> > +PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
> >  PKG_LICENSE:=X11
> >  PKG_LICENSE_FILES:=LICENSE
> >  PKG_CPE_ID:=cpe:/a:libunwind_project:libunwind
> >
> > -PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
> > +PKG_FIXUP:=autoreconf
> > +PKG_INSTALL:=1
> > +PKG_BUILD_PARALLEL:=1
> >
> > -PKG_SSP:=0
> >  include $(INCLUDE_DIR)/package.mk
> >
> >  define Package/libunwind
> > @@ -43,19 +43,22 @@ endef
> >  CONFIGURE_ARGS += \
> >         --disable-documentation \
> >         --disable-tests \
> > -       --enable-minidebuginfo=no \
> > +       --disable-minidebuginfo
> >
> > +TARGET_LDFLAGS += $(if $(CONFIG_USE_MUSL),-lssp_nonshared)
> >
> >  define Package/libunwind/install
> >         $(INSTALL_DIR) $(1)/usr/lib
> >         $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so.* $(1)/usr/lib/
> >  endef
> >
> > +ifeq ($(CONFIG_arc),)
> >  define Build/InstallDev
> >         $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
> >         $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include
> >         $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so* $(1)/usr/lib
> >         $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
> >  endef
> > +endif
> >
> >  $(eval $(call BuildPackage,libunwind))
> > diff --git a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> > index 465abb4ce0..479004a27e 100644
> > --- a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> > +++ b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
> > @@ -1,7 +1,7 @@
> >  diff -uprN a/include/libunwind-mips.h b/include/libunwind-mips.h
> >  --- a/include/libunwind-mips.h 2012-10-06 12:54:38.000000000 +0800
> >  +++ b/include/libunwind-mips.h 2016-06-08 13:55:55.029436442 +0800
> > -@@ -111,6 +111,42 @@ typedef enum
> > +@@ -114,6 +114,42 @@ typedef enum
> >     }
> >   mips_regnum_t;
> >
> > diff --git a/package/libs/libunwind/patches/005-aarch64-sigset_t.patch b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
> > new file mode 100644
> > index 0000000000..7abc61c41a
> > --- /dev/null
> > +++ b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
> > @@ -0,0 +1,21 @@
> > +diff --git a/include/libunwind-aarch64.h b/include/libunwind-aarch64.h
> > +index 778b436..926fbbc 100644
> > +--- a/include/libunwind-aarch64.h
> > ++++ b/include/libunwind-aarch64.h
> > +@@ -34,6 +34,7 @@ extern "C" {
> > + #include <inttypes.h>
> > + #include <stddef.h>
> > + #include <ucontext.h>
> > ++#include <signal.h>
> > +
> > + #define UNW_TARGET      aarch64
> > + #define UNW_TARGET_AARCH64      1
> > +@@ -192,7 +193,7 @@ typedef struct
> > +       unsigned long uc_flags;
> > +       struct ucontext *uc_link;
> > +       stack_t uc_stack;
> > +-      __sigset_t uc_sigmask;
> > ++      sigset_t uc_sigmask;
> > +       struct unw_sigcontext uc_mcontext;
> > +   } unw_tdep_context_t;
> > +
> > diff --git a/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
> > new file mode 100644
> > index 0000000000..ce93df4fad
> > --- /dev/null
> > +++ b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
> > @@ -0,0 +1,10 @@
> > +--- a/src/unwind/libunwind.pc.in
> > ++++ b/src/unwind/libunwind.pc.in
> > +@@ -6,6 +6,6 @@
> > + Name: libunwind
> > + Description: libunwind base library
> > + Version: @VERSION@
> > +-Libs: -L${libdir} -lunwind
> > ++Libs: -L${libdir} -lunwind -lucontext
> > + Libs.private: @LIBLZMA@
> > + Cflags: -I${includedir}
> > diff --git a/package/libs/libunwind/patches/010-gcc10.patch b/package/libs/libunwind/patches/010-gcc10.patch
> > new file mode 100644
> > index 0000000000..8b4801c175
> > --- /dev/null
> > +++ b/package/libs/libunwind/patches/010-gcc10.patch
> > @@ -0,0 +1,442 @@
> > +From 29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e Mon Sep 17 00:00:00 2001
> > +From: Yichao Yu <yyc1992@gmail.com>
> > +Date: Tue, 31 Mar 2020 00:43:32 -0400
> > +Subject: [PATCH] Fix compilation with -fno-common.
> > +
> > +Making all other archs consistent with IA64 which should not have this problem.
> > +Also move the FIXME to the correct place.
> > +
> > +Also add some minimum comments about this...
> > +---
> > + src/aarch64/Ginit.c                        | 15 +++++++--------
> > + src/arm/Ginit.c                            | 15 +++++++--------
> > + src/coredump/_UPT_get_dyn_info_list_addr.c |  5 +++++
> > + src/hppa/Ginit.c                           | 15 +++++++--------
> > + src/ia64/Ginit.c                           |  1 +
> > + src/mi/Gfind_dynamic_proc_info.c           |  1 +
> > + src/mips/Ginit.c                           | 15 +++++++--------
> > + src/ppc32/Ginit.c                          | 11 +++++++----
> > + src/ppc64/Ginit.c                          | 11 +++++++----
> > + src/ptrace/_UPT_get_dyn_info_list_addr.c   |  5 +++++
> > + src/s390x/Ginit.c                          | 15 +++++++--------
> > + src/sh/Ginit.c                             | 15 +++++++--------
> > + src/tilegx/Ginit.c                         | 15 +++++++--------
> > + src/x86/Ginit.c                            | 15 +++++++--------
> > + src/x86_64/Ginit.c                         | 15 +++++++--------
> > + 15 files changed, 89 insertions(+), 80 deletions(-)
> > +
> > +diff --git a/src/aarch64/Ginit.c b/src/aarch64/Ginit.c
> > +index dec235c82..35389762f 100644
> > +--- a/src/aarch64/Ginit.c
> > ++++ b/src/aarch64/Ginit.c
> > +@@ -61,13 +61,6 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -78,7 +71,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/arm/Ginit.c b/src/arm/Ginit.c
> > +index 2720d063a..0bac0d72d 100644
> > +--- a/src/arm/Ginit.c
> > ++++ b/src/arm/Ginit.c
> > +@@ -57,18 +57,17 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/coredump/_UPT_get_dyn_info_list_addr.c
> > +index 0d1190556..739ed0569 100644
> > +--- a/src/coredump/_UPT_get_dyn_info_list_addr.c
> > ++++ b/src/coredump/_UPT_get_dyn_info_list_addr.c
> > +@@ -74,6 +74,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> > +
> > + #else
> > +
> > ++/* XXX fix me: there is currently no way to locate the dyn-info list
> > ++       by a remote unwinder.  On ia64, this is done via a special
> > ++       unwind-table entry.  Perhaps something similar can be done with
> > ++       DWARF2 unwind info.  */
> > ++
> > + static inline int
> > + get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> > +                int *countp)
> > +diff --git a/src/hppa/Ginit.c b/src/hppa/Ginit.c
> > +index 461e4b93d..265455a68 100644
> > +--- a/src/hppa/Ginit.c
> > ++++ b/src/hppa/Ginit.c
> > +@@ -64,13 +64,6 @@ _Uhppa_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -81,7 +74,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/ia64/Ginit.c b/src/ia64/Ginit.c
> > +index b09a2ad57..8601bb3ca 100644
> > +--- a/src/ia64/Ginit.c
> > ++++ b/src/ia64/Ginit.c
> > +@@ -68,6 +68,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +   if (!_U_dyn_info_list_addr)
> > +     return -UNW_ENOINFO;
> > + #endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > +   *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +diff --git a/src/mi/Gfind_dynamic_proc_info.c b/src/mi/Gfind_dynamic_proc_info.c
> > +index 98d350128..2e7c62e5e 100644
> > +--- a/src/mi/Gfind_dynamic_proc_info.c
> > ++++ b/src/mi/Gfind_dynamic_proc_info.c
> > +@@ -49,6 +49,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
> > +     return -UNW_ENOINFO;
> > + #endif
> > +
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > +   list = (unw_dyn_info_list_t *) (uintptr_t) _U_dyn_info_list_addr ();
> > +   for (di = list->first; di; di = di->next)
> > +     if (ip >= di->start_ip && ip < di->end_ip)
> > +diff --git a/src/mips/Ginit.c b/src/mips/Ginit.c
> > +index 3df170c75..bf7a8f5a8 100644
> > +--- a/src/mips/Ginit.c
> > ++++ b/src/mips/Ginit.c
> > +@@ -69,13 +69,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -86,7 +79,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/ppc32/Ginit.c b/src/ppc32/Ginit.c
> > +index ba302448a..7b4545580 100644
> > +--- a/src/ppc32/Ginit.c
> > ++++ b/src/ppc32/Ginit.c
> > +@@ -96,9 +96,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -109,7 +106,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/ppc64/Ginit.c b/src/ppc64/Ginit.c
> > +index 4c88cd6e7..7bfb395a7 100644
> > +--- a/src/ppc64/Ginit.c
> > ++++ b/src/ppc64/Ginit.c
> > +@@ -95,9 +95,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -108,7 +105,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/ptrace/_UPT_get_dyn_info_list_addr.c b/src/ptrace/_UPT_get_dyn_info_list_addr.c
> > +index cc5ed0441..16671d453 100644
> > +--- a/src/ptrace/_UPT_get_dyn_info_list_addr.c
> > ++++ b/src/ptrace/_UPT_get_dyn_info_list_addr.c
> > +@@ -71,6 +71,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> > +
> > + #else
> > +
> > ++/* XXX fix me: there is currently no way to locate the dyn-info list
> > ++       by a remote unwinder.  On ia64, this is done via a special
> > ++       unwind-table entry.  Perhaps something similar can be done with
> > ++       DWARF2 unwind info.  */
> > ++
> > + static inline int
> > + get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
> > +                int *countp)
> > +diff --git a/src/s390x/Ginit.c b/src/s390x/Ginit.c
> > +index f0886ac93..db01743c0 100644
> > +--- a/src/s390x/Ginit.c
> > ++++ b/src/s390x/Ginit.c
> > +@@ -50,8 +50,6 @@ static struct unw_addr_space local_addr_space;
> > +
> > + unw_addr_space_t unw_local_addr_space = &local_addr_space;
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > + static inline void *
> > + uc_addr (ucontext_t *uc, int reg)
> > + {
> > +@@ -75,11 +73,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -90,7 +83,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/sh/Ginit.c b/src/sh/Ginit.c
> > +index 52988a721..9fe96d2bd 100644
> > +--- a/src/sh/Ginit.c
> > ++++ b/src/sh/Ginit.c
> > +@@ -58,13 +58,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -75,7 +68,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/tilegx/Ginit.c b/src/tilegx/Ginit.c
> > +index 7564a558b..925e64132 100644
> > +--- a/src/tilegx/Ginit.c
> > ++++ b/src/tilegx/Ginit.c
> > +@@ -64,13 +64,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -81,7 +74,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/x86/Ginit.c b/src/x86/Ginit.c
> > +index f6b8dc27d..3cec74a21 100644
> > +--- a/src/x86/Ginit.c
> > ++++ b/src/x86/Ginit.c
> > +@@ -54,13 +54,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
> > +
> > + # endif /* UNW_LOCAL_ONLY */
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -71,7 +64,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > +diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
> > +index a865d3385..fd8d418b1 100644
> > +--- a/src/x86_64/Ginit.c
> > ++++ b/src/x86_64/Ginit.c
> > +@@ -49,13 +49,6 @@ static struct unw_addr_space local_addr_space;
> > +
> > + unw_addr_space_t unw_local_addr_space = &local_addr_space;
> > +
> > +-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
> > +-
> > +-/* XXX fix me: there is currently no way to locate the dyn-info list
> > +-       by a remote unwinder.  On ia64, this is done via a special
> > +-       unwind-table entry.  Perhaps something similar can be done with
> > +-       DWARF2 unwind info.  */
> > +-
> > + static void
> > + put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
> > + {
> > +@@ -66,7 +59,13 @@ static int
> > + get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
> > +                         void *arg)
> > + {
> > +-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
> > ++#ifndef UNW_LOCAL_ONLY
> > ++# pragma weak _U_dyn_info_list_addr
> > ++  if (!_U_dyn_info_list_addr)
> > ++    return -UNW_ENOINFO;
> > ++#endif
> > ++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
> > ++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
> > +   return 0;
> > + }
> > +
> > --
> > 2.26.2
> >
> >
> > _______________________________________________
> > openwrt-devel mailing list
> > openwrt-devel@lists.openwrt.org
> > https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Yousong Zhou July 29, 2020, 5:13 a.m. UTC | #3
On Wed, 29 Jul 2020 at 11:56, Rosen Penev <rosenp@gmail.com> wrote:
>
> On Tue, Jul 28, 2020 at 6:57 PM Yousong Zhou <yszhou4tech@gmail.com> wrote:
> >
> > On Wed, 29 Jul 2020 at 04:29, Rosen Penev <rosenp@gmail.com> wrote:
> > >
> > > Cleanup Makefile for consistency with other ones.
> > >
> > > Remove PKG_SSP. It can be fixed with -lssp_nonshared.
> > >
> > > Add PKG_BUILD_PARALLEL for faster compilation.
> > >
> > > Add some alpine pathes to fix potential issues.
> >
> > This is just too vague and random.  What are those potential issues?
> > Add some description patch description what's wrong and why we need
> > them, to make it more clear in the future when we can get rid of them!
> Sure.
> >
> > >
> > > Backport GCC 10 patch to fix compilation.
> > >
> > > Remove the InstallDev section for ARC. libunwind does not support ARC
> > > and fails to compile. It seems InstallDev ignores the !arc DEPENDS.
> >
> > Likely it's not caused by InstallDev, reasons given in
> > https://github.com/openwrt/packages/pull/12959#issuecomment-665021413
> I'm not talking about openvswitch. I'm talking about
> https://downloads.openwrt.org/snapshots/faillogs/arc_archs/base/libunwind/compile.txt
> >

It was failing in the configure stage.  Unlikely InstallDev has
anything to do with it.  More details?

Regards,
                yousong
Rosen Penev July 29, 2020, 6:38 a.m. UTC | #4
On Tue, Jul 28, 2020 at 10:13 PM Yousong Zhou <yszhou4tech@gmail.com> wrote:
>
> On Wed, 29 Jul 2020 at 11:56, Rosen Penev <rosenp@gmail.com> wrote:
> >
> > On Tue, Jul 28, 2020 at 6:57 PM Yousong Zhou <yszhou4tech@gmail.com> wrote:
> > >
> > > On Wed, 29 Jul 2020 at 04:29, Rosen Penev <rosenp@gmail.com> wrote:
> > > >
> > > > Cleanup Makefile for consistency with other ones.
> > > >
> > > > Remove PKG_SSP. It can be fixed with -lssp_nonshared.
> > > >
> > > > Add PKG_BUILD_PARALLEL for faster compilation.
> > > >
> > > > Add some alpine pathes to fix potential issues.
> > >
> > > This is just too vague and random.  What are those potential issues?
> > > Add some description patch description what's wrong and why we need
> > > them, to make it more clear in the future when we can get rid of them!
> > Sure.
> > >
> > > >
> > > > Backport GCC 10 patch to fix compilation.
> > > >
> > > > Remove the InstallDev section for ARC. libunwind does not support ARC
> > > > and fails to compile. It seems InstallDev ignores the !arc DEPENDS.
> > >
> > > Likely it's not caused by InstallDev, reasons given in
> > > https://github.com/openwrt/packages/pull/12959#issuecomment-665021413
> > I'm not talking about openvswitch. I'm talking about
> > https://downloads.openwrt.org/snapshots/faillogs/arc_archs/base/libunwind/compile.txt
> > >
>
> It was failing in the configure stage.  Unlikely InstallDev has
> anything to do with it.  More details?
InstallDev has everything to do with this. I fixed this issue with
liburcu in this way as well.

It was failing on the buildbots in the same way.
>
> Regards,
>                 yousong
diff mbox series

Patch

diff --git a/package/libs/libunwind/Makefile b/package/libs/libunwind/Makefile
index 994ee97a17..b0bf75077b 100644
--- a/package/libs/libunwind/Makefile
+++ b/package/libs/libunwind/Makefile
@@ -9,22 +9,22 @@ 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=libunwind
-PKG_VERSION:=1.3.1
+PKG_VERSION:=1.4.0
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=@SAVANNAH/$(PKG_NAME)
-PKG_HASH:=43997a3939b6ccdf2f669b50fdb8a4d3205374728c2923ddc2354c65260214f8
-PKG_FIXUP:=autoreconf
-PKG_INSTALL:=1
+PKG_HASH:=df59c931bd4d7ebfd83ee481c943edf015138089b8e50abed8d9c57ba9338435
 
+PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
 PKG_LICENSE:=X11
 PKG_LICENSE_FILES:=LICENSE
 PKG_CPE_ID:=cpe:/a:libunwind_project:libunwind
 
-PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
+PKG_FIXUP:=autoreconf
+PKG_INSTALL:=1
+PKG_BUILD_PARALLEL:=1
 
-PKG_SSP:=0
 include $(INCLUDE_DIR)/package.mk
 
 define Package/libunwind
@@ -43,19 +43,22 @@  endef
 CONFIGURE_ARGS += \
 	--disable-documentation \
 	--disable-tests \
-	--enable-minidebuginfo=no \
+	--disable-minidebuginfo
 
+TARGET_LDFLAGS += $(if $(CONFIG_USE_MUSL),-lssp_nonshared)
 
 define Package/libunwind/install
 	$(INSTALL_DIR) $(1)/usr/lib
 	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so.* $(1)/usr/lib/
 endef
 
+ifeq ($(CONFIG_arc),)
 define Build/InstallDev
 	$(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
 	$(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include
 	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libunwin*.so* $(1)/usr/lib
 	$(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
 endef
+endif
 
 $(eval $(call BuildPackage,libunwind))
diff --git a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
index 465abb4ce0..479004a27e 100644
--- a/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
+++ b/package/libs/libunwind/patches/003-fix-missing-ef_reg-defs-with-musl.patch
@@ -1,7 +1,7 @@ 
 diff -uprN a/include/libunwind-mips.h b/include/libunwind-mips.h
 --- a/include/libunwind-mips.h	2012-10-06 12:54:38.000000000 +0800
 +++ b/include/libunwind-mips.h	2016-06-08 13:55:55.029436442 +0800
-@@ -111,6 +111,42 @@ typedef enum
+@@ -114,6 +114,42 @@ typedef enum
    }
  mips_regnum_t;
  
diff --git a/package/libs/libunwind/patches/005-aarch64-sigset_t.patch b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
new file mode 100644
index 0000000000..7abc61c41a
--- /dev/null
+++ b/package/libs/libunwind/patches/005-aarch64-sigset_t.patch
@@ -0,0 +1,21 @@ 
+diff --git a/include/libunwind-aarch64.h b/include/libunwind-aarch64.h
+index 778b436..926fbbc 100644
+--- a/include/libunwind-aarch64.h
++++ b/include/libunwind-aarch64.h
+@@ -34,6 +34,7 @@ extern "C" {
+ #include <inttypes.h>
+ #include <stddef.h>
+ #include <ucontext.h>
++#include <signal.h>
+ 
+ #define UNW_TARGET      aarch64
+ #define UNW_TARGET_AARCH64      1
+@@ -192,7 +193,7 @@ typedef struct
+ 	unsigned long uc_flags;
+ 	struct ucontext *uc_link;
+ 	stack_t uc_stack;
+-	__sigset_t uc_sigmask;
++	sigset_t uc_sigmask;
+ 	struct unw_sigcontext uc_mcontext;
+   } unw_tdep_context_t;
+ 
diff --git a/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
new file mode 100644
index 0000000000..ce93df4fad
--- /dev/null
+++ b/package/libs/libunwind/patches/006-fix-libunwind-pc-in.patch
@@ -0,0 +1,10 @@ 
+--- a/src/unwind/libunwind.pc.in
++++ b/src/unwind/libunwind.pc.in
+@@ -6,6 +6,6 @@
+ Name: libunwind
+ Description: libunwind base library
+ Version: @VERSION@
+-Libs: -L${libdir} -lunwind
++Libs: -L${libdir} -lunwind -lucontext
+ Libs.private: @LIBLZMA@
+ Cflags: -I${includedir}
diff --git a/package/libs/libunwind/patches/010-gcc10.patch b/package/libs/libunwind/patches/010-gcc10.patch
new file mode 100644
index 0000000000..8b4801c175
--- /dev/null
+++ b/package/libs/libunwind/patches/010-gcc10.patch
@@ -0,0 +1,442 @@ 
+From 29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e Mon Sep 17 00:00:00 2001
+From: Yichao Yu <yyc1992@gmail.com>
+Date: Tue, 31 Mar 2020 00:43:32 -0400
+Subject: [PATCH] Fix compilation with -fno-common.
+
+Making all other archs consistent with IA64 which should not have this problem.
+Also move the FIXME to the correct place.
+
+Also add some minimum comments about this...
+---
+ src/aarch64/Ginit.c                        | 15 +++++++--------
+ src/arm/Ginit.c                            | 15 +++++++--------
+ src/coredump/_UPT_get_dyn_info_list_addr.c |  5 +++++
+ src/hppa/Ginit.c                           | 15 +++++++--------
+ src/ia64/Ginit.c                           |  1 +
+ src/mi/Gfind_dynamic_proc_info.c           |  1 +
+ src/mips/Ginit.c                           | 15 +++++++--------
+ src/ppc32/Ginit.c                          | 11 +++++++----
+ src/ppc64/Ginit.c                          | 11 +++++++----
+ src/ptrace/_UPT_get_dyn_info_list_addr.c   |  5 +++++
+ src/s390x/Ginit.c                          | 15 +++++++--------
+ src/sh/Ginit.c                             | 15 +++++++--------
+ src/tilegx/Ginit.c                         | 15 +++++++--------
+ src/x86/Ginit.c                            | 15 +++++++--------
+ src/x86_64/Ginit.c                         | 15 +++++++--------
+ 15 files changed, 89 insertions(+), 80 deletions(-)
+
+diff --git a/src/aarch64/Ginit.c b/src/aarch64/Ginit.c
+index dec235c82..35389762f 100644
+--- a/src/aarch64/Ginit.c
++++ b/src/aarch64/Ginit.c
+@@ -61,13 +61,6 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -78,7 +71,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/arm/Ginit.c b/src/arm/Ginit.c
+index 2720d063a..0bac0d72d 100644
+--- a/src/arm/Ginit.c
++++ b/src/arm/Ginit.c
+@@ -57,18 +57,17 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/coredump/_UPT_get_dyn_info_list_addr.c
+index 0d1190556..739ed0569 100644
+--- a/src/coredump/_UPT_get_dyn_info_list_addr.c
++++ b/src/coredump/_UPT_get_dyn_info_list_addr.c
+@@ -74,6 +74,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+ 
+ #else
+ 
++/* XXX fix me: there is currently no way to locate the dyn-info list
++       by a remote unwinder.  On ia64, this is done via a special
++       unwind-table entry.  Perhaps something similar can be done with
++       DWARF2 unwind info.  */
++
+ static inline int
+ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+                int *countp)
+diff --git a/src/hppa/Ginit.c b/src/hppa/Ginit.c
+index 461e4b93d..265455a68 100644
+--- a/src/hppa/Ginit.c
++++ b/src/hppa/Ginit.c
+@@ -64,13 +64,6 @@ _Uhppa_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -81,7 +74,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/ia64/Ginit.c b/src/ia64/Ginit.c
+index b09a2ad57..8601bb3ca 100644
+--- a/src/ia64/Ginit.c
++++ b/src/ia64/Ginit.c
+@@ -68,6 +68,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+   if (!_U_dyn_info_list_addr)
+     return -UNW_ENOINFO;
+ #endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
+   *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+diff --git a/src/mi/Gfind_dynamic_proc_info.c b/src/mi/Gfind_dynamic_proc_info.c
+index 98d350128..2e7c62e5e 100644
+--- a/src/mi/Gfind_dynamic_proc_info.c
++++ b/src/mi/Gfind_dynamic_proc_info.c
+@@ -49,6 +49,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
+     return -UNW_ENOINFO;
+ #endif
+ 
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
+   list = (unw_dyn_info_list_t *) (uintptr_t) _U_dyn_info_list_addr ();
+   for (di = list->first; di; di = di->next)
+     if (ip >= di->start_ip && ip < di->end_ip)
+diff --git a/src/mips/Ginit.c b/src/mips/Ginit.c
+index 3df170c75..bf7a8f5a8 100644
+--- a/src/mips/Ginit.c
++++ b/src/mips/Ginit.c
+@@ -69,13 +69,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -86,7 +79,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/ppc32/Ginit.c b/src/ppc32/Ginit.c
+index ba302448a..7b4545580 100644
+--- a/src/ppc32/Ginit.c
++++ b/src/ppc32/Ginit.c
+@@ -96,9 +96,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -109,7 +106,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/ppc64/Ginit.c b/src/ppc64/Ginit.c
+index 4c88cd6e7..7bfb395a7 100644
+--- a/src/ppc64/Ginit.c
++++ b/src/ppc64/Ginit.c
+@@ -95,9 +95,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -108,7 +105,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/ptrace/_UPT_get_dyn_info_list_addr.c b/src/ptrace/_UPT_get_dyn_info_list_addr.c
+index cc5ed0441..16671d453 100644
+--- a/src/ptrace/_UPT_get_dyn_info_list_addr.c
++++ b/src/ptrace/_UPT_get_dyn_info_list_addr.c
+@@ -71,6 +71,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+ 
+ #else
+ 
++/* XXX fix me: there is currently no way to locate the dyn-info list
++       by a remote unwinder.  On ia64, this is done via a special
++       unwind-table entry.  Perhaps something similar can be done with
++       DWARF2 unwind info.  */
++
+ static inline int
+ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg,
+                int *countp)
+diff --git a/src/s390x/Ginit.c b/src/s390x/Ginit.c
+index f0886ac93..db01743c0 100644
+--- a/src/s390x/Ginit.c
++++ b/src/s390x/Ginit.c
+@@ -50,8 +50,6 @@ static struct unw_addr_space local_addr_space;
+ 
+ unw_addr_space_t unw_local_addr_space = &local_addr_space;
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+ static inline void *
+ uc_addr (ucontext_t *uc, int reg)
+ {
+@@ -75,11 +73,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -90,7 +83,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/sh/Ginit.c b/src/sh/Ginit.c
+index 52988a721..9fe96d2bd 100644
+--- a/src/sh/Ginit.c
++++ b/src/sh/Ginit.c
+@@ -58,13 +58,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -75,7 +68,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/tilegx/Ginit.c b/src/tilegx/Ginit.c
+index 7564a558b..925e64132 100644
+--- a/src/tilegx/Ginit.c
++++ b/src/tilegx/Ginit.c
+@@ -64,13 +64,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -81,7 +74,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/x86/Ginit.c b/src/x86/Ginit.c
+index f6b8dc27d..3cec74a21 100644
+--- a/src/x86/Ginit.c
++++ b/src/x86/Ginit.c
+@@ -54,13 +54,6 @@ tdep_uc_addr (ucontext_t *uc, int reg)
+ 
+ # endif /* UNW_LOCAL_ONLY */
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -71,7 +64,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+ 
+diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
+index a865d3385..fd8d418b1 100644
+--- a/src/x86_64/Ginit.c
++++ b/src/x86_64/Ginit.c
+@@ -49,13 +49,6 @@ static struct unw_addr_space local_addr_space;
+ 
+ unw_addr_space_t unw_local_addr_space = &local_addr_space;
+ 
+-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
+-
+-/* XXX fix me: there is currently no way to locate the dyn-info list
+-       by a remote unwinder.  On ia64, this is done via a special
+-       unwind-table entry.  Perhaps something similar can be done with
+-       DWARF2 unwind info.  */
+-
+ static void
+ put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
+ {
+@@ -66,7 +59,13 @@ static int
+ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
+                         void *arg)
+ {
+-  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
++#ifndef UNW_LOCAL_ONLY
++# pragma weak _U_dyn_info_list_addr
++  if (!_U_dyn_info_list_addr)
++    return -UNW_ENOINFO;
++#endif
++  // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so.
++  *dyn_info_list_addr = _U_dyn_info_list_addr ();
+   return 0;
+ }
+