[PATCHv2] libunwind: update to 1.4.0

Rosen Penev rosenp at gmail.com
Tue Jul 28 23:55:46 EDT 2020


On Tue, Jul 28, 2020 at 6:57 PM Yousong Zhou <yszhou4tech at gmail.com> wrote:
>
> On Wed, 29 Jul 2020 at 04:29, Rosen Penev <rosenp at 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 at 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 at gmail.com>
> >  PKG_LICENSE:=X11
> >  PKG_LICENSE_FILES:=LICENSE
> >  PKG_CPE_ID:=cpe:/a:libunwind_project:libunwind
> >
> > -PKG_MAINTAINER:=Yousong Zhou <yszhou4tech at 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 at 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 at lists.openwrt.org
> > https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list