* Re: [PATCH] nptl: Move stack list variables into _rtld_global
[not found] ` <87zgzhbjy0.fsf@oldenburg.str.redhat.com>
@ 2021-03-05 17:58 ` Simon Marchi via Gdb-patches
2021-03-05 18:03 ` Florian Weimer via Gdb-patches
0 siblings, 1 reply; 6+ messages in thread
From: Simon Marchi via Gdb-patches @ 2021-03-05 17:58 UTC (permalink / raw)
To: Florian Weimer, Simon Marchi via Libc-alpha, gdb-patches
On 2021-03-05 12:15 p.m., Florian Weimer wrote:> * Simon Marchi via Libc-alpha:
>
>> On 2020-11-13 10:10 a.m., Florian Weimer wrote:
>>> 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.
>>
>> Hi Florian,
>>
>> Presumably starting with this commit (I don't really know how to build a
>> glibc and test against it), GDB fails to attach to a threaded process
>> because libthread_db fails to initialize. See:
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=27526
>>
>> The difference in behavior as seen from GDB is that libthread_db now
>> asks to look up a symbol "_dl_stack_user" in module NULL. GDB can't
>> find this symbol, which fails the initialization.
>>
>> Can you shed some light on this? Is this request expected, and where is
>> GDB expected to find this symbol?
>
> It is not expected. This is the fallback path if _rtld_global cannot be
> located. The actual failure is that __td_ta_rtld_global does not
> succeed.
[adding gdb-patches]
Ok, thanks for that tip. Indeed I see that GDB returns PS_NOSYM for
_rtld_global. If I now log what GDB returns:
LOOKUP nptl_version in libpthread.so.0
Found 0x7fdb02713037
LOOKUP _rtld_global in ld-linux-x86-64.so.2
Not found
LOOKUP _dl_stack_user in (null)
Not found
So this lookup of _rtld_global is new too. And I think I see the
problem, it looks like an ordering issue: libthread_db is loaded when
GDB notices the program has libpthread loaded in it. When attaching,
GDB walks the shared library list. In that list, libpthread comes
before ld-linux. So at the time we try to load libthread_db, GDB hasn't
yet noticed that the program has ld-linux loaded in it, hasn't ingested
its symbols, so doesn't find _rtld_global.
For comparison, glibc 2.31 (on Ubuntu 20.04) only requested symbols in
libpthread itself, so there wasn't this ordering issue:
LOOKUP nptl_version in libpthread.so.0
Found 0x7f38538e9037
LOOKUP __stack_user in libpthread.so.0
Found 0x7f38538f3350
LOOKUP _thread_db_list_t_next in libpthread.so.0
Found 0x7f38538e93b0
LOOKUP _thread_db_const_thread_area in libpthread.so.0
Found 0x7f38538e92b4
LOOKUP _thread_db_sizeof_pthread in libpthread.so.0
Found 0x7f38538e92cc
LOOKUP _thread_db_pthread_specific in libpthread.so.0
Found 0x7f38538e9400
LOOKUP _thread_db_pthread_schedpolicy in libpthread.so.0
Found 0x7f38538e9420
LOOKUP _thread_db_pthread_schedparam_sched_priority in libpthread.so.0
Found 0x7f38538e9410
LOOKUP _thread_db_pthread_tid in libpthread.so.0
Found 0x7f38538e9450
LOOKUP _thread_db_pthread_cancelhandling in libpthread.so.0
Found 0x7f38538e9430
LOOKUP _thread_db_pthread_report_events in libpthread.so.0
Found 0x7f38538e9460
LOOKUP _thread_db_pthread_start_routine in libpthread.so.0
Found 0x7f38538e9440
LOOKUP _thread_db_pthread_eventbuf_eventmask_event_bits in libpthread.so.0
Found 0x7f38538e93d0
If we have to deal with this, I guess that GDB should now do things in a
different order: go through the whole library list and load their
symbols. And then if one of those libraries were libpthread, try to
initialize libthread_db.
Simon
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nptl: Move stack list variables into _rtld_global
2021-03-05 17:58 ` [PATCH] nptl: Move stack list variables into _rtld_global Simon Marchi via Gdb-patches
@ 2021-03-05 18:03 ` Florian Weimer via Gdb-patches
2021-03-05 18:45 ` Simon Marchi via Gdb-patches
0 siblings, 1 reply; 6+ messages in thread
From: Florian Weimer via Gdb-patches @ 2021-03-05 18:03 UTC (permalink / raw)
To: Simon Marchi; +Cc: Simon Marchi via Libc-alpha, gdb-patches
* Simon Marchi:
> On 2021-03-05 12:15 p.m., Florian Weimer wrote:> * Simon Marchi via Libc-alpha:
>>
>>> On 2020-11-13 10:10 a.m., Florian Weimer wrote:
>>>> 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.
>>>
>>> Hi Florian,
>>>
>>> Presumably starting with this commit (I don't really know how to build a
>>> glibc and test against it), GDB fails to attach to a threaded process
>>> because libthread_db fails to initialize. See:
>>>
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=27526
>>>
>>> The difference in behavior as seen from GDB is that libthread_db now
>>> asks to look up a symbol "_dl_stack_user" in module NULL. GDB can't
>>> find this symbol, which fails the initialization.
>>>
>>> Can you shed some light on this? Is this request expected, and where is
>>> GDB expected to find this symbol?
>>
>> It is not expected. This is the fallback path if _rtld_global cannot be
>> located. The actual failure is that __td_ta_rtld_global does not
>> succeed.
>
> [adding gdb-patches]
>
> Ok, thanks for that tip. Indeed I see that GDB returns PS_NOSYM for
> _rtld_global. If I now log what GDB returns:
>
> LOOKUP nptl_version in libpthread.so.0
> Found 0x7fdb02713037
> LOOKUP _rtld_global in ld-linux-x86-64.so.2
> Not found
> LOOKUP _dl_stack_user in (null)
> Not found
>
> So this lookup of _rtld_global is new too. And I think I see the
> problem, it looks like an ordering issue: libthread_db is loaded when
> GDB notices the program has libpthread loaded in it. When attaching,
> GDB walks the shared library list. In that list, libpthread comes
> before ld-linux. So at the time we try to load libthread_db, GDB hasn't
> yet noticed that the program has ld-linux loaded in it, hasn't ingested
> its symbols, so doesn't find _rtld_global.
Oh, that reads like a plausible explanation. And I assume the
non-attaching case, where GDB starts the process, is very different, and
this ordering issue does not appear?
> If we have to deal with this, I guess that GDB should now do things in a
> different order: go through the whole library list and load their
> symbols. And then if one of those libraries were libpthread, try to
> initialize libthread_db.
Initialization of libthread_db should be unconditional. Programs use
TLS data without linking against libpthread. And glibc 2.34 might not
have a separate libpthread at all.
Thanks,
Florian
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nptl: Move stack list variables into _rtld_global
2021-03-05 18:03 ` Florian Weimer via Gdb-patches
@ 2021-03-05 18:45 ` Simon Marchi via Gdb-patches
2021-03-05 19:00 ` Florian Weimer via Gdb-patches
0 siblings, 1 reply; 6+ messages in thread
From: Simon Marchi via Gdb-patches @ 2021-03-05 18:45 UTC (permalink / raw)
To: Florian Weimer; +Cc: Simon Marchi via Libc-alpha, gdb-patches
On 2021-03-05 1:03 p.m., Florian Weimer wrote:
> Oh, that reads like a plausible explanation. And I assume the
> non-attaching case, where GDB starts the process, is very different, and
> this ordering issue does not appear?
Indeed, in that case ld-linux-x86-64.so.2 is loaded before
libpthread.so.0 (ld-linux is necessarily loaded before the others, I
guess, since it's the one loading the others). So the symbol is found:
LOOKUP _rtld_global in ld-linux-x86-64.so.2
Found 0x7ffff7ffd000
>> If we have to deal with this, I guess that GDB should now do things in a
>> different order: go through the whole library list and load their
>> symbols. And then if one of those libraries were libpthread, try to
>> initialize libthread_db.
>
> Initialization of libthread_db should be unconditional. Programs use
> TLS data without linking against libpthread. And glibc 2.34 might not
> have a separate libpthread at all.
Ok, currently GDB attempts to load libthread_db when noticing the main
objfile / program (I guess it is needed if the program is statically
linked to libpthread?) or when seeing a library named libpthread*.
I'm not sure how to fix this, other than making GDB attempt to load
libthread_db on every new shared library it notices, since that new
shared library may "finally" make it work. The current code
specifically exists to avoid trying to load libthread_db for every new
shared library we notice, since that was considered wasteful. Here's
the original thread about it:
https://sourceware.org/pipermail/gdb-patches/2011-October/085781.html
https://pi.simark.ca/gdb-patches/20111005182705.D744E2461D1@ruffy.mtv.corp.google.com/
About the hypothetical scenario for glibc 2.34: do you mean that the
pthread infrastructure will directly be in libc.so? If so, our current
strategy of attempting to load libthread_db only for the main program
or a libpthread* library will indeed not work. And I suppose that will
also require trying to load libthread_db on every new shared lib...
Simon
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nptl: Move stack list variables into _rtld_global
2021-03-05 18:45 ` Simon Marchi via Gdb-patches
@ 2021-03-05 19:00 ` Florian Weimer via Gdb-patches
2021-03-29 8:26 ` Florian Weimer
0 siblings, 1 reply; 6+ messages in thread
From: Florian Weimer via Gdb-patches @ 2021-03-05 19:00 UTC (permalink / raw)
To: Simon Marchi; +Cc: Simon Marchi via Libc-alpha, gdb-patches
* Simon Marchi:
>>> If we have to deal with this, I guess that GDB should now do things in a
>>> different order: go through the whole library list and load their
>>> symbols. And then if one of those libraries were libpthread, try to
>>> initialize libthread_db.
>>
>> Initialization of libthread_db should be unconditional. Programs use
>> TLS data without linking against libpthread. And glibc 2.34 might not
>> have a separate libpthread at all.
>
> Ok, currently GDB attempts to load libthread_db when noticing the main
> objfile / program (I guess it is needed if the program is statically
> linked to libpthread?) or when seeing a library named libpthread*.
Would it be possible to load libthread_db unconditionally after loading
all shared objects? Then it is loaded only once.
> About the hypothetical scenario for glibc 2.34: do you mean that the
> pthread infrastructure will directly be in libc.so? If so, our current
> strategy of attempting to load libthread_db only for the main program
> or a libpthread* library will indeed not work. And I suppose that will
> also require trying to load libthread_db on every new shared lib...
I think one attempt loading is enough, after all shared objects are
available. In both the attaching and starting case, libpthread will be
seen by libthread_db if it is there. I do not think it is necessary to
try loading libpthread_db again for each dlopen. Maybe you could
restrict that to trigger on libpthread, but then dlopen of libpthread
does not really work today.
Thanks,
Florian
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nptl: Move stack list variables into _rtld_global
2021-03-05 19:00 ` Florian Weimer via Gdb-patches
@ 2021-03-29 8:26 ` Florian Weimer
2021-03-29 14:29 ` Simon Marchi via Gdb-patches
0 siblings, 1 reply; 6+ messages in thread
From: Florian Weimer @ 2021-03-29 8:26 UTC (permalink / raw)
To: gdb-patches; +Cc: Simon Marchi via Libc-alpha
* Florian Weimer via Gdb-patches:
> * Simon Marchi:
>
>>>> If we have to deal with this, I guess that GDB should now do things in a
>>>> different order: go through the whole library list and load their
>>>> symbols. And then if one of those libraries were libpthread, try to
>>>> initialize libthread_db.
>>>
>>> Initialization of libthread_db should be unconditional. Programs use
>>> TLS data without linking against libpthread. And glibc 2.34 might not
>>> have a separate libpthread at all.
>>
>> Ok, currently GDB attempts to load libthread_db when noticing the main
>> objfile / program (I guess it is needed if the program is statically
>> linked to libpthread?) or when seeing a library named libpthread*.
>
> Would it be possible to load libthread_db unconditionally after loading
> all shared objects? Then it is loaded only once.
>
>> About the hypothetical scenario for glibc 2.34: do you mean that the
>> pthread infrastructure will directly be in libc.so? If so, our current
>> strategy of attempting to load libthread_db only for the main program
>> or a libpthread* library will indeed not work. And I suppose that will
>> also require trying to load libthread_db on every new shared lib...
>
> I think one attempt loading is enough, after all shared objects are
> available. In both the attaching and starting case, libpthread will be
> seen by libthread_db if it is there. I do not think it is necessary to
> try loading libpthread_db again for each dlopen. Maybe you could
> restrict that to trigger on libpthread, but then dlopen of libpthread
> does not really work today.
I would appreciate if we could make some progress on this issue.
Please let me know if you need glibc test builds or something in that
area. Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] nptl: Move stack list variables into _rtld_global
2021-03-29 8:26 ` Florian Weimer
@ 2021-03-29 14:29 ` Simon Marchi via Gdb-patches
0 siblings, 0 replies; 6+ messages in thread
From: Simon Marchi via Gdb-patches @ 2021-03-29 14:29 UTC (permalink / raw)
To: Florian Weimer, gdb-patches; +Cc: Simon Marchi via Libc-alpha
On 2021-03-29 4:26 a.m., Florian Weimer wrote:> * Florian Weimer via Gdb-patches:
>
>> * Simon Marchi:
>>
>>>>> If we have to deal with this, I guess that GDB should now do things in a
>>>>> different order: go through the whole library list and load their
>>>>> symbols. And then if one of those libraries were libpthread, try to
>>>>> initialize libthread_db.
>>>>
>>>> Initialization of libthread_db should be unconditional. Programs use
>>>> TLS data without linking against libpthread. And glibc 2.34 might not
>>>> have a separate libpthread at all.
>>>
>>> Ok, currently GDB attempts to load libthread_db when noticing the main
>>> objfile / program (I guess it is needed if the program is statically
>>> linked to libpthread?) or when seeing a library named libpthread*.
>>
>> Would it be possible to load libthread_db unconditionally after loading
>> all shared objects? Then it is loaded only once.
>>
>>> About the hypothetical scenario for glibc 2.34: do you mean that the
>>> pthread infrastructure will directly be in libc.so? If so, our current
>>> strategy of attempting to load libthread_db only for the main program
>>> or a libpthread* library will indeed not work. And I suppose that will
>>> also require trying to load libthread_db on every new shared lib...
>>
>> I think one attempt loading is enough, after all shared objects are
>> available. In both the attaching and starting case, libpthread will be
>> seen by libthread_db if it is there. I do not think it is necessary to
>> try loading libpthread_db again for each dlopen. Maybe you could
>> restrict that to trigger on libpthread, but then dlopen of libpthread
>> does not really work today.
>
> I would appreciate if we could make some progress on this issue.
> Please let me know if you need glibc test builds or something in that
> area. Thanks.
Hi Florian,
I'll try to look into it, but I can't promise anything as I have nearly
zero free / personal time for GDB these days.
Simon
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-03-29 14:29 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <87a6vlthqn.fsf@oldenburg2.str.redhat.com>
[not found] ` <0f7bf7d7-36f9-ce7f-0390-4b39eeb0fffc@polymtl.ca>
[not found] ` <87zgzhbjy0.fsf@oldenburg.str.redhat.com>
2021-03-05 17:58 ` [PATCH] nptl: Move stack list variables into _rtld_global Simon Marchi via Gdb-patches
2021-03-05 18:03 ` Florian Weimer via Gdb-patches
2021-03-05 18:45 ` Simon Marchi via Gdb-patches
2021-03-05 19:00 ` Florian Weimer via Gdb-patches
2021-03-29 8:26 ` Florian Weimer
2021-03-29 14:29 ` Simon Marchi via Gdb-patches
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox