diff options
author | Yichao Yu <yyc1992@gmail.com> | 2020-03-31 00:43:32 -0400 |
---|---|---|
committer | Dave Watson <dade.watson@gmail.com> | 2020-03-31 08:06:29 -0700 |
commit | 29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e (patch) | |
tree | b95a49509c3f9d18550fd03ada3a098c2c583cd2 | |
parent | 2157664745ddff0d34e8b0d620d14e0912f4296d (diff) | |
download | libunwind-29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e.tar.gz |
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...
-rw-r--r-- | src/aarch64/Ginit.c | 15 | ||||
-rw-r--r-- | src/arm/Ginit.c | 15 | ||||
-rw-r--r-- | src/coredump/_UPT_get_dyn_info_list_addr.c | 5 | ||||
-rw-r--r-- | src/hppa/Ginit.c | 15 | ||||
-rw-r--r-- | src/ia64/Ginit.c | 1 | ||||
-rw-r--r-- | src/mi/Gfind_dynamic_proc_info.c | 1 | ||||
-rw-r--r-- | src/mips/Ginit.c | 15 | ||||
-rw-r--r-- | src/ppc32/Ginit.c | 11 | ||||
-rw-r--r-- | src/ppc64/Ginit.c | 11 | ||||
-rw-r--r-- | src/ptrace/_UPT_get_dyn_info_list_addr.c | 5 | ||||
-rw-r--r-- | src/s390x/Ginit.c | 15 | ||||
-rw-r--r-- | src/sh/Ginit.c | 15 | ||||
-rw-r--r-- | src/tilegx/Ginit.c | 15 | ||||
-rw-r--r-- | src/x86/Ginit.c | 15 | ||||
-rw-r--r-- | 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 dec235c8..35389762 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 2720d063..0bac0d72 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 0d119055..739ed056 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 461e4b93..265455a6 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 b09a2ad5..8601bb3c 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 98d35012..2e7c62e5 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 3df170c7..bf7a8f5a 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 ba302448..7b454558 100644 --- a/src/ppc32/Ginit.c +++ b/src/ppc32/Ginit.c @@ -91,9 +91,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) { @@ -104,7 +101,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 4c88cd6e..7bfb395a 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 cc5ed044..16671d45 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 f0886ac9..db01743c 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 52988a72..9fe96d2b 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 7564a558..925e6413 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 f6b8dc27..3cec74a2 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 a865d338..fd8d418b 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; } |