Hi Max, Max Filippov wrote,
Waldemar,
On Mon, Jul 20, 2015 at 4:33 PM, Junling Zheng zhengjunling@huawei.com wrote:
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=416b630981788c1f08e74...
Signed-off-by: Junling Zheng zhengjunling@huawei.com
libpthread/nptl_db/db_info.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libpthread/nptl_db/db_info.c b/libpthread/nptl_db/db_info.c index a57a053..159a027 100644 --- a/libpthread/nptl_db/db_info.c +++ b/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
Please apply this patch to the uClibc-ng as well, it fixes inspection of TLS variables in gdb for many architectures.
Thanks for remembering me. Applied and pushed now!
best regards Waldemar