123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445 |
- 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...
- [Retrieved from:
- https://github.com/libunwind/libunwind/commit/29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e]
- Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
- ---
- 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
- @@ -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 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;
- }
-
|