Whamcloud - gitweb
Work around Debian Bug #712530
authorTheodore Ts'o <tytso@mit.edu>
Sun, 16 Jun 2013 20:14:40 +0000 (16:14 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 16 Jun 2013 21:54:39 +0000 (17:54 -0400)
Add a test to see if the backtrace() function requires linking in a
library in /usr/lib.

Addresses-Debian-Bug: #708307

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
configure
configure.in
debian/scripts/test-backtrace [new file with mode: 0755]
e2fsck/Makefile.in
e2fsck/sigcatcher.c
lib/config.h.in

index fdbb3e9..4c47f7a 100755 (executable)
--- a/configure
+++ b/configure
@@ -842,6 +842,7 @@ enable_testio_debug
 enable_libuuid
 enable_libblkid
 enable_quota
+enable_backtrace
 enable_debugfs
 enable_imager
 enable_resizer
@@ -1497,6 +1498,7 @@ Optional Features:
   --disable-libuuid      do not build private uuid library
   --disable-libblkid     do not build private blkid library
   --enable-quota         enable quota support
+  --disable-backtrace    disable use backtrace
   --disable-debugfs      disable support of debugfs program
   --disable-imager       disable support of e2image program
   --disable-resizer      disable support of e2resize program
@@ -5332,6 +5334,26 @@ DEPPROFILED_LIBQUOTA=$PROFILED_LIBQUOTA
 
 
 
+
+# Check whether --enable-backtrace was given.
+if test "${enable_backtrace+set}" = set; then :
+  enableval=$enable_backtrace; if test "$enableval" = "no"
+then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: Disabling use of backtrace" >&5
+$as_echo "Disabling use of backtrace" >&6; }
+       $as_echo "#define DISABLE_BACKTRACE 1" >>confdefs.h
+
+else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: Enabling use of backtrace" >&5
+$as_echo "Enabling use of backtrace" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: Enabling use of backtrace by default" >&5
+$as_echo "Enabling use of backtrace by default" >&6; }
+
+fi
+
 # Check whether --enable-debugfs was given.
 if test "${enable_debugfs+set}" = set; then :
   enableval=$enable_debugfs; if test "$enableval" = "no"
index 5ca968f..fc65b03 100644 (file)
@@ -596,6 +596,22 @@ AC_SUBST(PROFILED_LIBQUOTA)
 AC_SUBST(DEPPROFILED_LIBQUOTA)
 AC_SUBST(QUOTA_CMT)
 dnl
+dnl handle --disable-backtrace
+dnl
+AH_TEMPLATE([DISABLE_BACKTRACE], [Define to 1 to disable use of backtrace])
+AC_ARG_ENABLE([backtrace],
+[  --disable-backtrace   disable use backtrace],
+if test "$enableval" = "no"
+then
+       AC_MSG_RESULT([Disabling use of backtrace])
+       AC_DEFINE(DISABLE_BACKTRACE, 1)
+else
+       AC_MSG_RESULT([Enabling use of backtrace])
+fi
+,
+AC_MSG_RESULT([Enabling use of backtrace by default])
+)
+dnl
 dnl handle --enable-debugfs
 dnl
 AC_ARG_ENABLE([debugfs],
diff --git a/debian/scripts/test-backtrace b/debian/scripts/test-backtrace
new file mode 100755 (executable)
index 0000000..d90486a
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# Test to see if backtrace requires a library in /usr/lib
+# Returns true if the backtrace command works and requires a library in /usr/lib
+# This is a nasty workaround for Debian bug #708307, which is really a glibc bug
+#
+
+cat > /tmp/backtrace$$.c << EOF
+
+#include <execinfo.h>
+
+int main(int argc, char **argv)
+{
+       void *stack_syms[32];
+       int frames;
+
+       frames = backtrace(stack_syms, 32);
+       backtrace_symbols_fd(stack_syms, frames, 0);
+}
+EOF
+
+if ! cc -o /tmp/backtrace$$ /tmp/backtrace$$.c; then
+   exit 1
+fi
+
+if ! ldd /tmp/backtrace$$ > /tmp/backtrace$$.ldd 2>&1 ; then
+   exit 1
+fi
+
+grep -q /usr/lib /tmp/backtrace$$.ldd
+ret=$?
+
+/bin/rm -f /tmp/backtrace$$*
+exit $ret
index 0c638e8..eadd5ea 100644 (file)
@@ -143,7 +143,8 @@ crc32table.h: gen_crc32table
        $(E) "  GEN32TABLE $@"
        $(Q) ./gen_crc32table > crc32table.h
 
-tst_sigcatcher: $(srcdir)/sigcatcher.c
+tst_sigcatcher: $(srcdir)/sigcatcher.c sigcatcher.o
+       $(E) "  CC $@"
        $(Q) $(CC) $(BUILD_LDFLAGS) $(ALL_CFLAGS) $(RDYNAMIC) \
                $(srcdir)/sigcatcher.c -DDEBUG -o tst_sigcatcher
 
index 13b9bcc..e4d60ce 100644 (file)
@@ -373,7 +373,7 @@ static void die_signal_handler(int signum, siginfo_t *siginfo,
               fprintf(stderr, "fault addr=%p", siginfo->si_addr);
        fprintf(stderr, "\n");
 
-#ifdef HAVE_BACKTRACE
+#if defined(HAVE_BACKTRACE) && !defined(DISABLE_BACKTRACE)
        frames = backtrace(stack_syms, 32);
        backtrace_symbols_fd(stack_syms, frames, 2);
 #endif
index 0c7d854..b500a2c 100644 (file)
@@ -26,6 +26,9 @@
 /* Define to 1 if using `alloca.c'. */
 #undef C_ALLOCA
 
+/* Define to 1 to disable use of backtrace */
+#undef DISABLE_BACKTRACE
+
 /* Define to 1 if ext2 compression enabled */
 #undef ENABLE_COMPRESSION