Browse Source

nptl_db/db_info: fix the incorrect initial size for dtvp

When debugging a program on ARMv7 with thread-local storage declared using
"__thread", attempting to print a thread-local variable will result in the
following message:

Cannot find thread-local storage for Thread <snip> (LWP <snip>), executable
file /tmp/tls: capability not available

This can be traced back to uclibc libpthread/nptl_db/td_thr_tls_get_addr.c
which gdb uses to look up the address of the TLS. The function returns
TD_NOCAPAB due to a mismatch in size between the DTV pointer and the size
recorded in the db description. The problem lies in libpthread/nptl_db/db_info.c
which initializes the db with the sizeof the union dtv. Instead it should
be the sizeof a pointer to union dtv.

Fixed the initial size for dtvp to sizeof a pointer, instead of sizeof
the union.

Refer to:
http://sourceware.org/ml/libc-alpha/2006-10/msg00088.html
https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=416b630981788c1f08e746e19765aa0e5c2a1360

Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
Junling Zheng 8 years ago
parent
commit
d63ef2748f
1 changed files with 1 additions and 1 deletions
  1. 1 1
      libpthread/nptl_db/db_info.c

+ 1 - 1
libpthread/nptl_db/db_info.c

@@ -60,7 +60,7 @@ extern bool __nptl_initial_report_events;
    i.e. at the very end of the area covered by TLS_PRE_TCB_SIZE.  */
 DESC (_thread_db_pthread_dtvp,
       TLS_PRE_TCB_SIZE + offsetof (tcbhead_t, dtv)
-      - (TLS_TCB_SIZE == 0 ? sizeof (tcbhead_t) : 0), union dtv)
+      - (TLS_TCB_SIZE == 0 ? sizeof (tcbhead_t) : 0), union dtv *)
 #endif