There is a gnulib bug in threadlib.m4 from at least serial 29 to serial
31 that incorrectly configures Cygwin support of weak references.

This leads to SIGSEGV stack smashing crashes with no backtrace
@ 0x00000000100000000 or 0x0000000500000000 etc. normally during tests.

Akim Demaille on bug-bison referred the issue to bug-gnulib where
Bruno Haible diagnosed and patched the problem to appear in
m4/threadlib.m4 serial 32:

* m4/threadlib.m4 (gl_WEAK_SYMBOLS): Force a "guessing no" result on Cygwin
https://lists.gnu.org/archive/html/bug-gnulib/2021-09/msg00068.html
[gl_cv_have_weak="guessing no"]

The patch has now been applied to bison, wget, and wget2, and I have
attached my patches for the copies in those packages, in case anyone
else has this issue in their (mainly GNU) packages which may incorporate by inclusion recently updated gnulib m4 macros used in autotools builds.

--
Take care. Thanks, Brian Inglis, Calgary, Alberta, Canada

This email may be disturbing to some readers as it contains
too much technical detail. Reader discretion is advised.
[Data in binary units and prefixes, physical quantities in SI.]
2021-09-17  Bruno Haible  <br...@clisp.org>

        threadlib: Avoid crashes in thread-related functions on Cygwin 3.2.0.
        Reported by Brian Inglis via Akim Demaille in
        <https://lists.gnu.org/archive/html/bug-gnulib/2021-09/msg00063.html>.
        * m4/threadlib.m4 (gl_WEAK_SYMBOLS): Force a "guessing no" result on
        Cygwin.

diff -w --git origsrc/m4/threadlib.m4 src/m4/threadlib.m4
index 37b797c18..6b43bbdfa 100644
--- origsrc/m4/threadlib.m4     2021-08-02 23:51:08.000000000 -0600
+++ src/m4/threadlib.m4 2021-09-17 15:17:37.103525500 -0600
@@ -1,4 +1,4 @@
-# threadlib.m4 serial 31
+# threadlib.m4 serial 32
 dnl Copyright (C) 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -84,38 +84,48 @@ AC_DEFUN([gl_WEAK_SYMBOLS],
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_CACHE_CHECK([whether imported symbols can be declared weak],
     [gl_cv_have_weak],
-    [gl_cv_have_weak=no
-     dnl First, test whether the compiler accepts it syntactically.
-     AC_LINK_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[extern void xyzzy ();
+    [case "$host_os" in
+       cygwin*)
+         dnl On Cygwin 3.2.0 with gcc 10.2, the test below would succeed, but
+         dnl programs that use pthread_in_use() with weak symbol references
+         dnl crash miserably at runtime.
+         gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+        dnl First, test whether the compiler accepts it syntactically.
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[extern void xyzzy ();
 #pragma weak xyzzy]],
-          [[xyzzy();]])],
-       [gl_cv_have_weak=maybe])
-     if test $gl_cv_have_weak = maybe; then
-       dnl Second, test whether it actually works. On Cygwin 1.7.2, with
-       dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
-       AC_RUN_IFELSE(
-         [AC_LANG_SOURCE([[
+             [[xyzzy();]])],
+          [gl_cv_have_weak=maybe])
+        if test $gl_cv_have_weak = maybe; then
+          dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+          dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+          AC_RUN_IFELSE(
+            [AC_LANG_SOURCE([[
 #include <stdio.h>
 #pragma weak fputs
 int main ()
 {
   return (fputs == NULL);
 }]])],
-         [gl_cv_have_weak=yes],
-         [gl_cv_have_weak=no],
-         [dnl When cross-compiling, assume that only ELF platforms support
-          dnl weak symbols.
-          AC_EGREP_CPP([Extensible Linking Format],
-            [#ifdef __ELF__
-             Extensible Linking Format
-             #endif
-            ],
-            [gl_cv_have_weak="guessing yes"],
-            [gl_cv_have_weak="guessing no"])
-         ])
-     fi
+            [gl_cv_have_weak=yes],
+            [gl_cv_have_weak=no],
+            [dnl When cross-compiling, assume that only ELF platforms support
+             dnl weak symbols.
+             AC_EGREP_CPP([Extensible Linking Format],
+               [#ifdef __ELF__
+                Extensible Linking Format
+                #endif
+               ],
+               [gl_cv_have_weak="guessing yes"],
+               [gl_cv_have_weak="guessing no"])
+            ])
+        fi
+        ;;
+     esac
      dnl But when linking statically, weak symbols don't work.
      case " $LDFLAGS " in
        *" -static "*) gl_cv_have_weak=no ;;
2021-09-17  Bruno Haible  <br...@clisp.org>

        threadlib: Avoid crashes in thread-related functions on Cygwin 3.2.0.
        Reported by Brian Inglis via Akim Demaille in
        <https://lists.gnu.org/archive/html/bug-gnulib/2021-09/msg00063.html>.
        * m4/threadlib.m4 (gl_WEAK_SYMBOLS): Force a "guessing no" result on
        Cygwin.

2021-09-27  Brian Inglis  <brian.ing...@systematicsw.ab.ca>

        Original patch backported from m4/threadlib.m4 serial 31 to serial 29

diff -w --git origsrc/m4/threadlib.m4 src/m4/threadlib.m4
index 37b797c18..6b43bbdfa 100644
--- origsrc/m4/threadlib.m4     2021-08-02 23:51:08.000000000 -0600
+++ src/m4/threadlib.m4 2021-09-17 15:17:37.103525500 -0600
@@ -1,4 +1,4 @@
-# threadlib.m4 serial 29
+# threadlib.m4 serial 30
 dnl Copyright (C) 2005-2021 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -84,38 +84,48 @@ AC_DEFUN([gl_WEAK_SYMBOLS],
   AC_REQUIRE([AC_CANONICAL_HOST])
   AC_CACHE_CHECK([whether imported symbols can be declared weak],
     [gl_cv_have_weak],
-    [gl_cv_have_weak=no
-     dnl First, test whether the compiler accepts it syntactically.
-     AC_LINK_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[extern void xyzzy ();
+    [case "$host_os" in
+       cygwin*)
+         dnl On Cygwin 3.2.0 with gcc 10.2, the test below would succeed, but
+         dnl programs that use pthread_in_use() with weak symbol references
+         dnl crash miserably at runtime.
+         gl_cv_have_weak="guessing no"
+         ;;
+       *)
+         gl_cv_have_weak=no
+         dnl First, test whether the compiler accepts it syntactically.
+         AC_LINK_IFELSE(
+           [AC_LANG_PROGRAM(
+              [[extern void xyzzy ();
 #pragma weak xyzzy]],
-          [[xyzzy();]])],
-       [gl_cv_have_weak=maybe])
-     if test $gl_cv_have_weak = maybe; then
-       dnl Second, test whether it actually works. On Cygwin 1.7.2, with
-       dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
-       AC_RUN_IFELSE(
-         [AC_LANG_SOURCE([[
+              [[xyzzy();]])],
+           [gl_cv_have_weak=maybe])
+         if test $gl_cv_have_weak = maybe; then
+           dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+           dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+           AC_RUN_IFELSE(
+             [AC_LANG_SOURCE([[
 #include <stdio.h>
 #pragma weak fputs
 int main ()
 {
   return (fputs == NULL);
 }]])],
-         [gl_cv_have_weak=yes],
-         [gl_cv_have_weak=no],
-         [dnl When cross-compiling, assume that only ELF platforms support
-          dnl weak symbols.
-          AC_EGREP_CPP([Extensible Linking Format],
-            [#ifdef __ELF__
-             Extensible Linking Format
-             #endif
-            ],
-            [gl_cv_have_weak="guessing yes"],
-            [gl_cv_have_weak="guessing no"])
-         ])
-     fi
+                [gl_cv_have_weak=yes],
+                [gl_cv_have_weak=no],
+                [dnl When cross-compiling, assume that only ELF platforms 
support
+                 dnl weak symbols.
+                 AC_EGREP_CPP([Extensible Linking Format],
+                   [#ifdef __ELF__
+                    Extensible Linking Format
+                    #endif
+                   ],
+                   [gl_cv_have_weak="guessing yes"],
+                   [gl_cv_have_weak="guessing no"])
+           ])
+         fi
+         ;;
+     esac
      dnl But when linking statically, weak symbols don't work.
      case " $LDFLAGS " in
        *" -static "*) gl_cv_have_weak=no ;;

Reply via email to