The following program crashes when built with -static on Fedora 35: #include <thread> int main(int argc, char *argv[]) { std::thread foo{[](){}}; foo.join(); return 0; } Dynamic linking works fine though: $ g++ f35_thread_static_broken.cpp $ ./a.out $ g++ -static f35_thread_static_broken.cpp $ ./a.out zsh: segmentation fault (core dumped) ./a.out
The binary doesn't have a definition of pthread_join.
libstdc++.a still uses weak symbols. I assumed we had already removed all that weak symbol stuff from libstdc++ for __GLIBC_PREREQ (2, 34).
Still a user error - you should link with -pthread
(In reply to Richard Biener from comment #3) > Still a user error - you should link with -pthread That doesn't help here though.
(In reply to Florian Weimer from comment #2) > libstdc++.a still uses weak symbols. I assumed we had already removed all > that weak symbol stuff from libstdc++ for __GLIBC_PREREQ (2, 34). No, none of that work has even started yet.
The master branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>: https://gcc.gnu.org/g:80fe172ba9820199c2bbce5d0611ffca27823049 commit r12-5108-g80fe172ba9820199c2bbce5d0611ffca27823049 Author: Jonathan Wakely <jwakely@redhat.com> Date: Tue Nov 9 23:45:36 2021 +0000 libstdc++: Disable gthreads weak symbols for glibc 2.34 [PR103133] Since Glibc 2.34 all pthreads symbols are defined directly in libc not libpthread, and since Glibc 2.32 we have used __libc_single_threaded to avoid unnecessary locking in single-threaded programs. This means there is no reason to avoid linking to libpthread now, and so no reason to use weak symbols defined in gthr-posix.h for all the pthread_xxx functions. libstdc++-v3/ChangeLog: PR libstdc++/100748 PR libstdc++/103133 * config/os/gnu-linux/os_defines.h (_GLIBCXX_GTHREAD_USE_WEAK): Define for glibc 2.34 and later.
Fixed on trunk, backports needed too.
For the record, musl does the same, since g:85da5c3024f731e719c4093314da8edcd1056527
The releases/gcc-11 branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>: https://gcc.gnu.org/g:293075002a7eaf1e9d457a1839bcaf83f8626824 commit r11-9301-g293075002a7eaf1e9d457a1839bcaf83f8626824 Author: Jonathan Wakely <jwakely@redhat.com> Date: Tue Nov 9 23:45:36 2021 +0000 libstdc++: Disable gthreads weak symbols for glibc 2.34 [PR103133] Since Glibc 2.34 all pthreads symbols are defined directly in libc not libpthread, and since Glibc 2.32 we have used __libc_single_threaded to avoid unnecessary locking in single-threaded programs. This means there is no reason to avoid linking to libpthread now, and so no reason to use weak symbols defined in gthr-posix.h for all the pthread_xxx functions. libstdc++-v3/ChangeLog: PR libstdc++/100748 PR libstdc++/103133 * config/os/gnu-linux/os_defines.h (_GLIBCXX_GTHREAD_USE_WEAK): Define for glibc 2.34 and later. (cherry picked from commit 80fe172ba9820199c2bbce5d0611ffca27823049)
Fixed for GCC 11.3
The releases/gcc-10 branch has been updated by Jonathan Wakely <redi@gcc.gnu.org>: https://gcc.gnu.org/g:18eecb8c4a97716d4bc4890b05c91f172fadc7b3 commit r10-10928-g18eecb8c4a97716d4bc4890b05c91f172fadc7b3 Author: Jonathan Wakely <jwakely@redhat.com> Date: Tue Nov 9 23:45:36 2021 +0000 libstdc++: Disable gthreads weak symbols for glibc 2.34 [PR103133] Since Glibc 2.34 all pthreads symbols are defined directly in libc not libpthread, and since Glibc 2.32 we have used __libc_single_threaded to avoid unnecessary locking in single-threaded programs. This means there is no reason to avoid linking to libpthread now, and so no reason to use weak symbols defined in gthr-posix.h for all the pthread_xxx functions. libstdc++-v3/ChangeLog: PR libstdc++/100748 PR libstdc++/103133 * config/os/gnu-linux/os_defines.h (_GLIBCXX_GTHREAD_USE_WEAK): Define for glibc 2.34 and later. (cherry picked from commit 80fe172ba9820199c2bbce5d0611ffca27823049)
Also fixed for 10.5