[lldb-dev] Access to TLS variables on GNU/Linux

Florian Weimer via lldb-dev lldb-dev at lists.llvm.org
Thu May 16 00:09:00 PDT 2019


* Jan Kratochvil:

> On Tue, 14 May 2019 13:38:57 +0200, Florian Weimer via lldb-dev wrote:
>> The target process has loaded libpthread.so.0, so it's not the usual
>> problem of libthread_db not working without libpthread.
>> 
>> On the other hand, I realize now that the lldb command cannot access TLS
>> variables, either.  Is this expected to work at all?
>
> TLS is implemented only for FreeBSD as there is
> FreeBSDThread::GetThreadPointer() but on Linux it falls back to unimplemented:
> 	lldb::addr_t Thread::GetThreadPointer() { return LLDB_INVALID_ADDRESS; }
>
> On Linux it uses DynamicLoaderPOSIXDYLD::GetThreadLocalData() which may work
> without libthread_db as it is reading "_thread_db_*" symbols in
> DYLDRendezvous::GetThreadInfo().  But it needs that GetThreadPointer() which
> could get implemented (for x86_64) by reading %fs_base.  LLDB currently does
> not know anything about %fs_base+%gs_base.
>
If I can get the TLS base address on x86 for a thread and if LLDB can
expose the offset of an initial-exec TLS variable inside the TLS block
of an object (which should be encoded in the ELF data), I can poke at
glibc internals and figure out the offset from thread pointer.

(Global-dynamic TLS is much more difficult to handle, of course.)

> Is it a good idea to implement %fs_base+%gs_base to make TLS working
> on Linux?

The register access would help, I think.  Even if the rest doesn't work.
If you have an experimental build, I can try it.

Thanks,
Florian


More information about the lldb-dev mailing list