libgcc/gthr-posix.h uses weak reference logic to determine if libpthread is linked into the application or not. This is broken unless there is special workaround with libc internal knowledge and even then static linking needs further manual link time workaround, so this was disabled for os/generic in libstdc++v3 and for musl in libgfortran.
The change minimizes the impact on other setups, but I think the weak ref logic should be disabled by default, it is never entirely correct. Conforming code can crash on a glibc setup too: $ cat a.cpp #include <pthread.h> void(*f)(void) = (void(*)(void))pthread_key_create; int main(){} $ g++ -static a.cpp -lpthread $ ./a.out Segmentation fault I reported this previously at https://gcc.gnu.org/ml/gcc/2014-11/msg00246.html libgfortran/Changelog: 2015-04-16 Szabolcs Nagy <szabolcs.n...@arm.com> * acinclude.m4 (GTHREAD_USE_WEAK): Define as 0 for *-*-musl*. * configure: Regenerate. libstdc++v3/Changelog: 2015-04-16 Szabolcs Nagy <szabolcs.n...@arm.com> * config/os/generic/os_defines.h (_GLIBCXX_GTHREAD_USE_WEAK): Define. * configure.host (os_include_dir): Set to "os/generic" for linux-musl*.
diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4 index ba890f9..30b8b1a6 100644 --- a/libgfortran/acinclude.m4 +++ b/libgfortran/acinclude.m4 @@ -100,7 +100,7 @@ void foo (void); [Define to 1 if the target supports #pragma weak]) fi case "$host" in - *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* ) + *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | *-*-musl* ) AC_DEFINE(GTHREAD_USE_WEAK, 0, [Define to 0 if the target shouldn't use #pragma weak]) ;; diff --git a/libgfortran/configure b/libgfortran/configure index e1592f7..07542e1 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -26447,7 +26447,7 @@ $as_echo "#define SUPPORTS_WEAK 1" >>confdefs.h fi case "$host" in - *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* ) + *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | *-*-musl* ) $as_echo "#define GTHREAD_USE_WEAK 0" >>confdefs.h diff --git a/libstdc++-v3/config/os/generic/os_defines.h b/libstdc++-v3/config/os/generic/os_defines.h index 45bf52a..103ec0e 100644 --- a/libstdc++-v3/config/os/generic/os_defines.h +++ b/libstdc++-v3/config/os/generic/os_defines.h @@ -33,4 +33,9 @@ // System-specific #define, typedefs, corrections, etc, go here. This // file will come before all others. +// Disable the weak reference logic in gthr.h for os/generic because it +// is broken on every platform unless there is implementation specific +// workaround in gthr-posix.h and at link-time for static linking. +#define _GLIBCXX_GTHREAD_USE_WEAK 0 + #endif diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host index 82ddc52..a349ce3 100644 --- a/libstdc++-v3/configure.host +++ b/libstdc++-v3/configure.host @@ -271,6 +271,9 @@ case "${host_os}" in freebsd*) os_include_dir="os/bsd/freebsd" ;; + linux-musl*) + os_include_dir="os/generic" + ;; gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu) if [ "$uclibc" = "yes" ]; then os_include_dir="os/uclibc"