]> Savannah Git Hosting - gnulib.git/commitdiff
stack-trace: Don't use NetBSD's broken libasan.
authorBruno Haible <bruno@clisp.org>
Thu, 18 Jul 2024 11:03:31 +0000 (13:03 +0200)
committerBruno Haible <bruno@clisp.org>
Thu, 18 Jul 2024 11:03:31 +0000 (13:03 +0200)
* m4/stack-trace.m4 (gl_STACK_TRACE_EARLY): Test whether a program
linked with libasan even minimally works.

ChangeLog
m4/stack-trace.m4

index 55ee80723e39c8b017c3c699785a3a4c4db56526..8aa53c8792834726233af6df579387ff076b4441 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2024-07-18  Bruno Haible  <bruno@clisp.org>
+
+       stack-trace: Don't use NetBSD's broken libasan.
+       * m4/stack-trace.m4 (gl_STACK_TRACE_EARLY): Test whether a program
+       linked with libasan even minimally works.
+
 2024-07-17  Bruno Haible  <bruno@clisp.org>
 
        stack-trace: Use libasan as an alternative to libbacktrace.
index e102484e0fd96e8133f6d4f92dd8c68afb88c078..faf86eefe97dd7abb9c9e598859c86ba1cfe6a01 100644 (file)
@@ -22,6 +22,7 @@ AC_DEFUN([gl_STACK_TRACE_EARLY],
   AC_MSG_RESULT([$enable_debug])
 
   AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
   if test $enable_debug = yes; then
     dnl The first choice is libbacktrace by Ian Lance Taylor.
     dnl Maintained at https://github.com/ianlancetaylor/libbacktrace,
@@ -54,50 +55,69 @@ AC_DEFUN([gl_STACK_TRACE_EARLY],
       AC_CACHE_CHECK([for libasan], [gl_cv_lib_asan], [
         gl_saved_LIBS="$LIBS"
         LIBS="$gl_saved_LIBS -lasan"
-        AC_LINK_IFELSE(
+        dnl We need AC_RUN_IFELSE here, not merely AC_LINK_IFELSE, because on
+        dnl NetBSD libasan exists but every program that links to it immediately
+        dnl prints "This sanitizer is not compatible with enabled ASLR" to
+        dnl standard error and exits with code 0, without even invoking main().
+        AC_RUN_IFELSE(
           [AC_LANG_PROGRAM(
-             [[extern
+             [[#include <stdio.h>
+               extern
                #ifdef __cplusplus
                "C"
                #endif
                void __sanitizer_print_stack_trace (void);
              ]],
-             [[__sanitizer_print_stack_trace ();
+             [[remove ("conftest.c");
+               __sanitizer_print_stack_trace ();
              ]])],
-          [gl_cv_lib_asan=yes],
-          [gl_cv_lib_asan=no])
+          [if test -f conftest.c; then
+             dnl main() was not reached. NetBSD!
+             gl_cv_lib_asan=no
+           else
+             gl_cv_lib_asan=yes
+           fi
+          ],
+          [gl_cv_lib_asan=no],
+          [case "$host_os" in
+             netbsd*) gl_cv_lib_asan="guessing no" ;;
+             *)       gl_cv_lib_asan="guessing yes" ;;
+           esac
+          ])
         LIBS="$gl_saved_LIBS"
       ])
-      if test $gl_cv_lib_asan = yes; then
-        AC_DEFINE([HAVE_LIBASAN], [1],
-          [Define if you have the libasan library.])
-        CAN_PRINT_STACK_TRACE=1
-        LIBS="$LIBS -lasan"
-      else
-        dnl The third choice is libexecinfo.
-        dnl It does not produce source file names and line numbers, only addresses
-        dnl (which are mostly useless due to ASLR) and _sometimes_ function names.
-        AC_REQUIRE([AC_CANONICAL_HOST])
-        case "$host_os" in
-          *-gnu* | gnu* | darwin* | freebsd* | dragonfly* | netbsd* | openbsd* | solaris*)
-            dnl execinfo might be implemented on this platform.
-            CAN_PRINT_STACK_TRACE=1
-            dnl On *BSD system, link all programs with -lexecinfo. Cf. m4/execinfo.m4.
-            case "$host_os" in
-              freebsd* | dragonfly* | netbsd* | openbsd*)
-                LIBS="$LIBS -lexecinfo"
-                ;;
-            esac
-            dnl Link all programs in such a way that the stack trace includes the
-            dnl function names. '-rdynamic' is equivalent to '-Wl,-export-dynamic'.
-            case "$host_os" in
-              *-gnu* | gnu* | openbsd*)
-                LDFLAGS="$LDFLAGS -rdynamic"
-                ;;
-            esac
-            ;;
-        esac
-      fi
+      case "$gl_cv_lib_asan" in
+        *yes)
+          AC_DEFINE([HAVE_LIBASAN], [1],
+            [Define if you have the libasan library.])
+          CAN_PRINT_STACK_TRACE=1
+          LIBS="$LIBS -lasan"
+          ;;
+        *)
+          dnl The third choice is libexecinfo.
+          dnl It does not produce source file names and line numbers, only addresses
+          dnl (which are mostly useless due to ASLR) and _sometimes_ function names.
+          case "$host_os" in
+            *-gnu* | gnu* | darwin* | freebsd* | dragonfly* | netbsd* | openbsd* | solaris*)
+              dnl execinfo might be implemented on this platform.
+              CAN_PRINT_STACK_TRACE=1
+              dnl On *BSD system, link all programs with -lexecinfo. Cf. m4/execinfo.m4.
+              case "$host_os" in
+                freebsd* | dragonfly* | netbsd* | openbsd*)
+                  LIBS="$LIBS -lexecinfo"
+                  ;;
+              esac
+              dnl Link all programs in such a way that the stack trace includes the
+              dnl function names. '-rdynamic' is equivalent to '-Wl,-export-dynamic'.
+              case "$host_os" in
+                *-gnu* | gnu* | openbsd*)
+                  LDFLAGS="$LDFLAGS -rdynamic"
+                  ;;
+              esac
+              ;;
+          esac
+          ;;
+      esac
     fi
   fi
 ])