Blob Blame History Raw
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/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;
 }