On Fri, 3 Mar 2023 at 09:33, Jonathan Wakely wrote: > > > On Fri, 3 Mar 2023 at 08:20, Alexandre Oliva via Libstdc++ < > libstdc++@gcc.gnu.org> wrote: > >> On Feb 17, 2023, Jonathan Wakely wrote: >> >> > The proper fix is to ensure the program has a non-weak reference to >> > pthread_join without extra help (or use a recent glibc where it always >> > works). >> >> Indeed! How about this? Regstrapped on x86_64-linux-gnu, also tested >> on arm-vx7r2 (gcc-12); verified that strong references are present in >> 95989.o, but not in libstdc++.a or .so. Ok to install? >> >> (nit: the static local in a ctor of a template class may make for >> multiple copies. Maybe a non-template always-inline function called by >> all instantiations would be better.) >> > > Yeah, that does seem less than ideal. > > Jakub previously suggested doing this for PR 61841, which was a similar > problem with pthread_create: > > __asm ("" : : "r" (&pthread_create)); would not be optimized away. > > > That would avoid the multiple copies. > As Jakub pointed out, it adds a scheduling barrier, but a few cycles when creating a new thread is probably not even measurable. > > Alternatively we could get really creative and cast the addresses of both > &pthread_create and &pthread_join to uintptr_t and XOR them, and pass that > as the __depend argument (which is never actually dereferenced, it's only > there to create a link-time dependency). > I should be clear that I don't think the creative solution is a good idea. And if we ever support building libstdc++ with LTO it will become visible that the argument is unused, and we'd need something like the asm dependency anyway. > > > >> >> >> link pthread_join from std::thread ctor >> >> Like pthread_create, pthread_join may fail to be statically linked in >> absent strong uses, so add to user code strong references to both when >> std::thread objects are created. >> >> >> for libstdc++-v3/ChangeLog >> >> * include/bits/std_thread.h (std::thread ctor): Add strong >> reference to pthread_join. >> >> --- >> libstdc++-v3/include/bits/std_thread.h | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/libstdc++-v3/include/bits/std_thread.h >> b/libstdc++-v3/include/bits/std_thread.h >> index adbd3928ff783..4bda350fa2c7b 100644 >> --- a/libstdc++-v3/include/bits/std_thread.h >> +++ b/libstdc++-v3/include/bits/std_thread.h >> @@ -145,6 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> #ifdef GTHR_ACTIVE_PROXY >> // Create a reference to pthread_create, not just the gthr weak >> symbol. >> auto __depend = reinterpret_cast(&pthread_create); >> + static auto __attribute__((__used__)) __depend_join = >> &pthread_join; >> #else >> auto __depend = nullptr; >> #endif >> >> >> -- >> Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/ >> Free Software Activist GNU Toolchain Engineer >> Disinformation flourishes because many people care deeply about injustice >> but very few check the facts. Ask me about >> >>