Skip to content

Commit

Permalink
build: improve backtrace support/detection
Browse files Browse the repository at this point in the history
libexecinfo is used to provide backtrace() on *BSD.  The API is
compatible with glibc's, so this is a "free" improvement.

To improve configure behaviour, the following configure options are
modified/introduced:

* --enable-gcc-rdynamic now defaults to "on" if the compiler is gcc.
  (I sadly wasn't able to find any documentation on the availability of
  this option for llvm, even though at least the version I have
  installed does support it)

* --enable-backtrace has been added.  This behaves as off/auto/on
  switch, i.e. giving either {dis,en}able will result in the requested
  behaviour (or an error if support wasn't found)

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
  • Loading branch information
eqvinox committed Apr 1, 2014
1 parent af51477 commit 8c99b4c
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 8 deletions.
3 changes: 3 additions & 0 deletions INSTALL.quagga.txt
Expand Up @@ -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
Expand Down
29 changes: 21 additions & 8 deletions configure.ac
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
10 changes: 10 additions & 0 deletions doc/install.texi
Expand Up @@ -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
Expand Down

0 comments on commit 8c99b4c

Please sign in to comment.