diff --git a/INSTALL.quagga.txt b/INSTALL.quagga.txt index 0d465879f5..11c85b1a31 100644 --- a/INSTALL.quagga.txt +++ b/INSTALL.quagga.txt @@ -31,6 +31,9 @@ not a guarantee of support, merely "we agree that it is broken".) OpenBSD ? [info needed on what should work] Solaris (modern/supported versions, including OpenSolaris forks) +On BSD systems, installing libexecinfo is strongly recommended in order +to get backtrace support. + For further Quagga specific information on 'configure' and build-time configuration of the software, please read the Quagga info documentation, (doc/quagga.info). To read the info page included with diff --git a/configure.ac b/configure.ac index ff7a4d5478..8964006a89 100755 --- a/configure.ac +++ b/configure.ac @@ -273,7 +273,9 @@ AC_ARG_ENABLE(gcc_ultra_verbose, AC_ARG_ENABLE(linux24_tcp_md5, [ --enable-linux24-tcp-md5 enable support for old, Linux-2.4 RFC2385 patch]) AC_ARG_ENABLE(gcc-rdynamic, -[ --enable-gcc-rdynamic enable gcc linking with -rdynamic for better backtraces]) +[ --enable-gcc-rdynamic enable linking with -rdynamic for better backtraces (default if gcc)]) +AC_ARG_ENABLE(backtrace, +[ --disable-backtrace, disable crash backtraces (default autodetect)]) AC_ARG_ENABLE(time-check, [ --disable-time-check disable slow thread warning messages]) AC_ARG_ENABLE(pcreposix, @@ -288,8 +290,10 @@ if test x"${enable_gcc_ultra_verbose}" = x"yes" ; then CFLAGS="${CFLAGS} -Wpacked -Wpadded" fi -if test x"${enable_gcc_rdynamic}" = x"yes" ; then - LDFLAGS="${LDFLAGS} -rdynamic" +if test x"${enable_gcc_rdynamic}" != x"no" ; then + if test x"${enable_gcc_rdynamic}" = x"yes" -o x"$COMPILER" = x"GCC"; then + LDFLAGS="${LDFLAGS} -rdynamic" + fi fi if test x"${enable_time_check}" != x"no" ; then @@ -1566,12 +1570,21 @@ AX_SYS_WEAK_ALIAS dnl --------------------------- dnl check for glibc 'backtrace' dnl --------------------------- -AC_CHECK_HEADER([execinfo.h], - [AC_CHECK_FUNC([backtrace], - [AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace]) - AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding]) +if test x"${enable_backtrace}" != x"no" ; then + backtrace_ok=no + AC_CHECK_HEADER([execinfo.h], [ + AC_SEARCH_LIBS([backtrace], [execinfo], [ + AC_DEFINE(HAVE_GLIBC_BACKTRACE,,[Glibc backtrace]) + AC_DEFINE(HAVE_STACK_TRACE,,[Stack symbol decoding]) + backtrace_ok=yes + ],, [-lm]) ]) -]) + + if test x"${enable_backtrace}" = x"yes" -a x"${backtrace_ok}" = x"no"; then + dnl user explicitly requested backtrace but we failed to find support + AC_MSG_FAILURE([failed to find backtrace support]) + fi +fi dnl ----------------------------------------- dnl check for malloc mallinfo struct and call diff --git a/doc/install.texi b/doc/install.texi index 0f8f65fab8..1e8d965bcf 100644 --- a/doc/install.texi +++ b/doc/install.texi @@ -96,6 +96,16 @@ installed. They can be excluded from build with this option, which will minimally decrease compile time and overhead. They can always be built and executed at a later time by running @command{make check} in the @file{tests/} subdirectory, even if they're excluded from build. +@item --enable-gcc-rdynamic +Pass the @command{-rdynamic} option to the linker driver. This is in most +cases neccessary for getting usable backtraces. This option defaults to on +if the compiler is detected as gcc, but giving an explicit enable/disable is +suggested. +@item --enable-backtrace +Controls backtrace support for the crash handlers. This is autodetected by +default. Using the switch will enforce the requested behaviour, failing with +an error if support is requested but not available. On BSD systems, this +needs libexecinfo, while on glibc support for this is part of libc itself. @end table You may specify any combination of the above options to the configure