diff --git a/configure.ac b/configure.ac index fb7b2ef7..71a2443a 100644 --- a/configure.ac +++ b/configure.ac @@ -323,6 +323,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ ]) AX_CHECK_CATCHABLE_SEGV +AX_CHECK_CATCHABLE_ABRT LT_INIT AC_SUBST(LIBTOOL_DEPS) diff --git a/m4/ax_check_catchable_abrt.m4 b/m4/ax_check_catchable_abrt.m4 new file mode 100644 index 00000000..140ab856 --- /dev/null +++ b/m4/ax_check_catchable_abrt.m4 @@ -0,0 +1,57 @@ +# SYNOPSIS +# +# AX_CHECK_CATCHABLE_ABRT +# +# DESCRIPTION +# +# Check whether SIGABRT can be caught using signal handlers. + +#serial 1 + +AC_DEFUN([AX_CHECK_CATCHABLE_ABRT], [dnl + AC_PREREQ(2.64) + AS_VAR_PUSHDEF([CACHEVAR], [ax_cv_check_[]_AC_LANG_ABBREV[]CATCHABLE_ABRT])dnl + AC_CACHE_CHECK([whether SIGABRT can be caught when using the _AC_LANG compiler], CACHEVAR, [ + AC_RUN_IFELSE([ + AC_LANG_PROGRAM([[ +#include +#include + +#ifndef SIGABRT +# error SIGABRT is not defined +#endif + +static void sigabrt_handler_3(int _) +{ + exit(0); +} + +static void sigabrt_handler_2(int _) +{ + signal(SIGABRT, sigabrt_handler_3); + abort(); + exit(1); +} + +static void sigabrt_handler_1(int _) +{ + signal(SIGABRT, sigabrt_handler_2); + abort(); + exit(1); +} + ]], [[ +signal(SIGABRT, sigabrt_handler_1); +abort(); +exit(1); + ]])], + [AS_VAR_SET(CACHEVAR, [yes])], + [AS_VAR_SET(CACHEVAR, [no])], + [AS_VAR_SET(CACHEVAR, [unknown])] + ) + ]) + AS_VAR_IF(CACHEVAR, yes, + [AC_DEFINE([HAVE_CATCHABLE_ABRT], [1], [Define if SIGABRT can be caught using signal handlers])], + [AC_MSG_WARN([On this platform, SIGABRT cannot be caught using signal handlers.])] + ) + AS_VAR_POPDEF([CACHEVAR])dnl +]) diff --git a/test/default/misuse.c b/test/default/misuse.c index 667e2ab0..24cee622 100644 --- a/test/default/misuse.c +++ b/test/default/misuse.c @@ -2,7 +2,7 @@ #define TEST_NAME "misuse" #include "cmptest.h" -#if defined(SIGABRT) && (defined(__APPLE__) || defined(__OpenBSD__)) +#ifdef HAVE_CATCHABLE_ABRT # include static void