aboutsummaryrefslogtreecommitdiff
path: root/nptl_db
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2020-11-16 19:33:30 +0100
committerFlorian Weimer <fweimer@redhat.com>2020-11-16 19:33:30 +0100
commit1daccf403b1bd86370eb94edca794dc106d02039 (patch)
treee54bc8ee71eb92b7114df79e2f378a477c470029 /nptl_db
parentaac0f62c47beee5b546bacc330acc2dd21cda0dc (diff)
downloadglibc-1daccf403b1bd86370eb94edca794dc106d02039.zip
glibc-1daccf403b1bd86370eb94edca794dc106d02039.tar.gz
glibc-1daccf403b1bd86370eb94edca794dc106d02039.tar.bz2
nptl: Move stack list variables into _rtld_global
Now __thread_gscope_wait (the function behind THREAD_GSCOPE_WAIT, formerly __wait_lookup_done) can be implemented directly in ld.so, eliminating the unprotected GL (dl_wait_lookup_done) function pointer. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'nptl_db')
-rw-r--r--nptl_db/structs.def4
-rw-r--r--nptl_db/td_init.c14
-rw-r--r--nptl_db/td_ta_map_lwp2thr.c2
-rw-r--r--nptl_db/td_ta_thr_iter.c4
-rw-r--r--nptl_db/td_thr_tlsbase.c7
-rw-r--r--nptl_db/td_thr_validate.c39
-rw-r--r--nptl_db/thread_dbP.h13
7 files changed, 70 insertions, 13 deletions
diff --git a/nptl_db/structs.def b/nptl_db/structs.def
index 472e900..2ca3359 100644
--- a/nptl_db/structs.def
+++ b/nptl_db/structs.def
@@ -69,8 +69,6 @@ DB_STRUCT (td_eventbuf_t)
DB_STRUCT_FIELD (td_eventbuf_t, eventnum)
DB_STRUCT_FIELD (td_eventbuf_t, eventdata)
-DB_SYMBOL (stack_used)
-DB_SYMBOL (__stack_user)
DB_SYMBOL (nptl_version)
DB_FUNCTION (__nptl_create_event)
DB_FUNCTION (__nptl_death_event)
@@ -106,6 +104,8 @@ DB_STRUCT (rtld_global)
DB_RTLD_VARIABLE (_rtld_global)
#endif
DB_RTLD_GLOBAL_FIELD (dl_tls_dtv_slotinfo_list)
+DB_RTLD_GLOBAL_FIELD (dl_stack_user)
+DB_RTLD_GLOBAL_FIELD (dl_stack_used)
DB_STRUCT (dtv_slotinfo_list)
DB_STRUCT_FIELD (dtv_slotinfo_list, len)
diff --git a/nptl_db/td_init.c b/nptl_db/td_init.c
index 86773dc..79a1f90 100644
--- a/nptl_db/td_init.c
+++ b/nptl_db/td_init.c
@@ -29,3 +29,17 @@ td_init (void)
LOG ("td_init");
return TD_OK;
}
+
+bool
+__td_ta_rtld_global (td_thragent_t *ta)
+{
+ if (ta->ta_addr__rtld_global == 0
+ && td_mod_lookup (ta->ph, LD_SO, SYM__rtld_global,
+ &ta->ta_addr__rtld_global) != PS_OK)
+ {
+ ta->ta_addr__rtld_global = (void*)-1;
+ return false;
+ }
+ else
+ return ta->ta_addr__rtld_global != (void*)-1;
+}
diff --git a/nptl_db/td_ta_map_lwp2thr.c b/nptl_db/td_ta_map_lwp2thr.c
index d04d4be..81ff488 100644
--- a/nptl_db/td_ta_map_lwp2thr.c
+++ b/nptl_db/td_ta_map_lwp2thr.c
@@ -187,7 +187,7 @@ td_ta_map_lwp2thr (const td_thragent_t *ta_arg,
fake a special descriptor for the initial thread. */
psaddr_t list;
- td_err_e err = DB_GET_SYMBOL (list, ta, __stack_user);
+ td_err_e err = __td_ta_stack_user (ta, &list);
if (err != TD_OK)
return err;
diff --git a/nptl_db/td_ta_thr_iter.c b/nptl_db/td_ta_thr_iter.c
index d59782b..e406bcb 100644
--- a/nptl_db/td_ta_thr_iter.c
+++ b/nptl_db/td_ta_thr_iter.c
@@ -133,14 +133,14 @@ td_ta_thr_iter (const td_thragent_t *ta_arg, td_thr_iter_f *callback,
have to iterate over both lists separately. We start with the
list of threads with user-defined stacks. */
- err = DB_GET_SYMBOL (list, ta, __stack_user);
+ err = __td_ta_stack_user (ta, &list);
if (err == TD_OK)
err = iterate_thread_list (ta, callback, cbdata_p, state, ti_pri,
list, true);
/* And the threads with stacks allocated by the implementation. */
if (err == TD_OK)
- err = DB_GET_SYMBOL (list, ta, stack_used);
+ err = __td_ta_stack_used (ta, &list);
if (err == TD_OK)
err = iterate_thread_list (ta, callback, cbdata_p, state, ti_pri,
list, false);
diff --git a/nptl_db/td_thr_tlsbase.c b/nptl_db/td_thr_tlsbase.c
index 8198934..eeba0a0 100644
--- a/nptl_db/td_thr_tlsbase.c
+++ b/nptl_db/td_thr_tlsbase.c
@@ -28,12 +28,7 @@ dtv_slotinfo_list (td_thragent_t *ta,
td_err_e err;
psaddr_t head;
- if (ta->ta_addr__rtld_global == 0
- && td_mod_lookup (ta->ph, LD_SO, SYM__rtld_global,
- &ta->ta_addr__rtld_global) != PS_OK)
- ta->ta_addr__rtld_global = (void*)-1;
-
- if (ta->ta_addr__rtld_global != (void*)-1)
+ if (__td_ta_rtld_global (ta))
{
err = DB_GET_FIELD (head, ta, ta->ta_addr__rtld_global,
rtld_global, _dl_tls_dtv_slotinfo_list, 0);
diff --git a/nptl_db/td_thr_validate.c b/nptl_db/td_thr_validate.c
index c709c5e..d2f4107 100644
--- a/nptl_db/td_thr_validate.c
+++ b/nptl_db/td_thr_validate.c
@@ -20,6 +20,41 @@
#include "thread_dbP.h"
#include <stdbool.h>
+td_err_e
+__td_ta_stack_user (td_thragent_t *ta, psaddr_t *plist)
+{
+ if (__td_ta_rtld_global (ta))
+ return DB_GET_FIELD_ADDRESS (*plist, ta, ta->ta_addr__rtld_global,
+ rtld_global, _dl_stack_user, 0);
+ else
+ {
+ if (ta->ta_addr__dl_stack_user == 0
+ && td_mod_lookup (ta->ph, NULL, SYM__dl_stack_user,
+ &ta->ta_addr__dl_stack_user) != PS_OK)
+ return TD_ERR;
+ *plist = ta->ta_addr__dl_stack_user;
+ return TD_OK;
+ }
+}
+
+td_err_e
+__td_ta_stack_used (td_thragent_t *ta, psaddr_t *plist)
+{
+
+ if (__td_ta_rtld_global (ta))
+ return DB_GET_FIELD_ADDRESS (*plist, ta, ta->ta_addr__rtld_global,
+ rtld_global, _dl_stack_used, 0);
+ else
+ {
+ if (ta->ta_addr__dl_stack_used == 0
+ && td_mod_lookup (ta->ph, NULL, SYM__dl_stack_used,
+ &ta->ta_addr__dl_stack_used) != PS_OK)
+ return TD_ERR;
+ *plist = ta->ta_addr__dl_stack_used;
+ return TD_OK;
+ }
+}
+
static td_err_e
check_thread_list (const td_thrhandle_t *th, psaddr_t head, bool *uninit)
{
@@ -62,7 +97,7 @@ td_thr_validate (const td_thrhandle_t *th)
/* First check the list with threads using user allocated stacks. */
bool uninit = false;
- err = DB_GET_SYMBOL (list, th->th_ta_p, __stack_user);
+ err = __td_ta_stack_user (th->th_ta_p, &list);
if (err == TD_OK)
err = check_thread_list (th, list, &uninit);
@@ -70,7 +105,7 @@ td_thr_validate (const td_thrhandle_t *th)
using implementation allocated stacks. */
if (err == TD_NOTHR)
{
- err = DB_GET_SYMBOL (list, th->th_ta_p, stack_used);
+ err = __td_ta_stack_used (th->th_ta_p, &list);
if (err == TD_OK)
err = check_thread_list (th, list, &uninit);
diff --git a/nptl_db/thread_dbP.h b/nptl_db/thread_dbP.h
index 8a666b8..9574e68 100644
--- a/nptl_db/thread_dbP.h
+++ b/nptl_db/thread_dbP.h
@@ -269,4 +269,17 @@ extern td_err_e _td_check_sizeof (td_thragent_t *ta, uint32_t *sizep,
extern td_err_e __td_ta_lookup_th_unique (const td_thragent_t *ta,
lwpid_t lwpid, td_thrhandle_t *th);
+/* Try to initialize TA->ta_addr__rtld_global. Return true on
+ success, false on failure (which may be cached). */
+bool __td_ta_rtld_global (td_thragent_t *ta) attribute_hidden;
+
+/* Obtain the address of the list_t fields _dl_stack_user and
+ _dl_stack_used in _rtld_global, or fall back to the global
+ variables of the same name (to support statically linked
+ programs). */
+td_err_e __td_ta_stack_user (td_thragent_t *ta, psaddr_t *plist)
+ attribute_hidden;
+td_err_e __td_ta_stack_used (td_thragent_t *ta, psaddr_t *plist)
+ attribute_hidden;
+
#endif /* thread_dbP.h */