diff --git a/configure.ac b/configure.ac index 10898c110c8e..c34201657f91 100644 --- a/configure.ac +++ b/configure.ac @@ -394,29 +394,6 @@ else fi fi -if test "$enable_stacktraces" != no; then - AC_CHECK_HEADERS([execinfo.h], [], [enable_stacktraces=no]) -fi - -AM_CONDITIONAL([ENABLE_STACKTRACES], [test "$enable_stacktraces" = "yes"]) -if test "$enable_stacktraces" = "yes"; then - AC_DEFINE(ENABLE_STACKTRACES, 1, [Define this symbol if stacktraces should be enabled]) -else - enable_crashhooks=no -fi - -AM_CONDITIONAL([ENABLE_CRASH_HOOKS], [test "$enable_crashhooks" = "yes"]) -if test "$enable_crashhooks" = "yes"; then - AC_DEFINE(ENABLE_CRASH_HOOKS, 1, [Define this symbol if crash hooks should be enabled]) -fi - -AX_CHECK_LINK_FLAG([-Wl,-wrap=__cxa_allocate_exception], [LINK_WRAP_SUPPORTED=yes],,,) -AM_CONDITIONAL([CRASH_HOOKS_WRAPPED_CXX_ABI],[test $LINK_WRAP_SUPPORTED = "yes"]) - -if test "$LINK_WRAP_SUPPORTED" = "yes"; then - AC_DEFINE(CRASH_HOOKS_WRAPPED_CXX_ABI, 1, [Define this symbol to use wrapped CXX ABIs for exception stacktraces]) -fi - # Needed for MinGW targets when debug symbols are enabled as compiled objects get very large AX_CHECK_COMPILE_FLAG([-Wa,-mbig-obj], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -Wa,-mbig-obj"],,,) @@ -968,6 +945,9 @@ case $host in *linux*) TARGET_OS=linux ;; + *bsd*) + TARGET_OS=bsd + ;; esac if test "$use_extended_functional_tests" != "no"; then @@ -1244,6 +1224,91 @@ if test "$use_thread_local" = "yes" || test "$use_thread_local" = "auto"; then LDFLAGS="$TEMP_LDFLAGS" fi +BACKTRACE_FLAGS= +BACKTRACE_LDFLAGS= +BACKTRACE_LIBS= +if test "$enable_stacktraces" != "no"; then + AC_CHECK_HEADERS([backtrace.h], [ + if test "$TARGET_OS" = "windows"; then + BACKTRACE_LIBS="$BACKTRACE_LIBS -ldbghelp" + else + AC_CHECK_HEADERS([execinfo.h], [ + if test "$TARGET_OS" = "bsd"; then + AC_SEARCH_LIBS([backtrace], [execinfo], [ + BACKTRACE_LIBS="$BACKTRACE_LIBS -lexecinfo" + ], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but cannot locate libexecinfo]) + fi + AC_MSG_WARN([cannot locate libexecinfo, stacktraces will be disabled]) + enable_stacktraces=no + ]) + fi + AX_CHECK_LINK_FLAG([-Wl,-export-dynamic], [BACKTRACE_LDFLAGS="$BACKTRACE_LDFLAGS -Wl,-export-dynamic"], [ + AX_CHECK_LINK_FLAG([-rdynamic], [BACKTRACE_LDFLAGS="$BACKTRACE_LDFLAGS -rdynamic"], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but cannot set requisite linker flags]) + fi + AC_MSG_WARN([cannot set requisite linker flags, stacktraces will be disabled]) + enable_stacktraces=no + ], [$LDFLAG_WERROR]) + ], [$LDFLAG_WERROR]) + ], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but execinfo.h was not found]) + fi + AC_MSG_WARN([execinfo.h was not found, stacktraces will be disabled]) + enable_stacktraces=no + ]) + fi + BACKTRACE_LIBS="$BACKTRACE_LIBS -lbacktrace" + dnl More modern compilers may emit DWARF 5 binaries by default, use DWARF 4 out of precaution + if test "$TARGET_OS" != "windows"; then + AX_CHECK_COMPILE_FLAG([-gdwarf-4], [BACKTRACE_FLAGS="$BACKTRACE_FLAGS -gdwarf-4"], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but cannot set -gdwarf-4]) + fi + AC_MSG_WARN([cannot set -gdwarf-4, stacktraces will be disabled]) + enable_stacktraces=no + ], [$CXXFLAG_WERROR]) + fi + if test "$TARGET_OS" = "darwin"; then + AX_CHECK_COMPILE_FLAG([-fno-standalone-debug], [BACKTRACE_FLAGS="$BACKTRACE_FLAGS -fno-standalone-debug"], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but cannot set -fno-standalone-debug]) + fi + AC_MSG_WARN([cannot set -fno-standalone-debug, stacktraces will be disabled]) + enable_stacktraces=no + ], [$CXXFLAG_WERROR]) + fi + ], [ + if test "$enable_stacktraces" = "yes"; then + AC_MSG_ERROR([--enable-stacktraces was specified but backtrace.h was not found]) + fi + AC_MSG_WARN([backtrace.h was not found, stacktraces will be disabled]) + enable_stacktraces=no + ]) +fi + +AM_CONDITIONAL([ENABLE_STACKTRACES], [test "$enable_stacktraces" = "yes"]) +if test "$enable_stacktraces" = "yes"; then + AC_DEFINE(ENABLE_STACKTRACES, 1, [Define this symbol if stacktraces should be enabled]) +else + enable_crashhooks=no +fi + +AM_CONDITIONAL([ENABLE_CRASH_HOOKS], [test "$enable_crashhooks" = "yes"]) +if test "$enable_crashhooks" = "yes"; then + AC_DEFINE(ENABLE_CRASH_HOOKS, 1, [Define this symbol if crash hooks should be enabled]) +fi + +AX_CHECK_LINK_FLAG([-Wl,-wrap=__cxa_allocate_exception], [LINK_WRAP_SUPPORTED=yes],,,) +AM_CONDITIONAL([CRASH_HOOKS_WRAPPED_CXX_ABI],[test $LINK_WRAP_SUPPORTED = "yes"]) + +if test "$LINK_WRAP_SUPPORTED" = "yes"; then + AC_DEFINE(CRASH_HOOKS_WRAPPED_CXX_ABI, 1, [Define this symbol to use wrapped CXX ABIs for exception stacktraces]) +fi + dnl Check for different ways of gathering OS randomness AC_MSG_CHECKING([for Linux getrandom syscall]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include @@ -1285,15 +1350,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include [ AC_MSG_RESULT([no])] ) -dnl ensure backtrace() is found, check -lexecinfo if necessary -if test "$TARGET_OS" != "windows"; then - if test "$enable_stacktraces" != "no"; then - AC_SEARCH_LIBS([backtrace], [execinfo], [], [ - AC_MSG_ERROR([Unable to find backtrace()]) - ]) - fi -fi - AC_MSG_CHECKING([for fdatasync]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ fdatasync(0); ]])], @@ -1986,6 +2042,9 @@ AC_SUBST(USE_QRCODE) AC_SUBST(TESTDEFS) AC_SUBST(MINIUPNPC_CPPFLAGS) AC_SUBST(MINIUPNPC_LIBS) +AC_SUBST(BACKTRACE_FLAGS) +AC_SUBST(BACKTRACE_LDFLAGS) +AC_SUBST(BACKTRACE_LIBS) AC_SUBST(GMP_LIBS) AC_SUBST(NATPMP_CPPFLAGS) AC_SUBST(NATPMP_LIBS) @@ -2080,11 +2139,11 @@ echo " target os = $host_os" echo " build os = $build_os" echo echo " CC = $CC" -echo " CFLAGS = $DEBUG_CFLAGS $PTHREAD_CFLAGS $CFLAGS" +echo " CFLAGS = $DEBUG_CFLAGS $PTHREAD_CFLAGS $BACKTRACE_FLAGS $CFLAGS" echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CORE_CPPFLAGS $CPPFLAGS" echo " CXX = $CXX" -echo " CXXFLAGS = $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $CORE_CXXFLAGS $CXXFLAGS" -echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $CORE_LDFLAGS $LDFLAGS" +echo " CXXFLAGS = $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $CORE_CXXFLAGS $BACKTRACE_FLAGS $CXXFLAGS" +echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $CORE_LDFLAGS $BACKTRACE_LDFLAGS $LDFLAGS" echo " AR = $AR" echo " ARFLAGS = $ARFLAGS" echo diff --git a/depends/packages/backtrace.mk b/depends/packages/backtrace.mk index de7f02fefc18..95717952e388 100644 --- a/depends/packages/backtrace.mk +++ b/depends/packages/backtrace.mk @@ -1,9 +1,9 @@ package=backtrace -$(package)_version=11427f31a64b11583fec94b4c2a265c7dafb1ab3 +$(package)_version=b9e40069c0b47a722286b94eb5231f7f05c08713 $(package)_download_path=https://github.com/ianlancetaylor/libbacktrace/archive $(package)_download_file=$($(package)_version).tar.gz $(package)_file_name=$(package)_$($(package)_version).tar.gz -$(package)_sha256_hash=76a8348ff04d80141aeb1c0e55879f17f241f38238def0eb1df7c6d1ac1a2c26 +$(package)_sha256_hash=81b37e762965c676b3316e90564c89f6480606add446651c785862571a1fdbca define $(package)_set_vars $(package)_config_opts=--disable-shared --enable-host-shared --prefix=$(host_prefix) diff --git a/src/Makefile.am b/src/Makefile.am index 9721e8e4f35e..c109b5013f7d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,9 +9,9 @@ print-%: FORCE DIST_SUBDIRS = secp256k1 -AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS) -AM_CFLAGS = $(DEBUG_CFLAGS) -AM_CXXFLAGS = $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS) $(CORE_CXXFLAGS) +AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS) $(BACKTRACE_LDFLAGS) +AM_CFLAGS = $(DEBUG_CFLAGS) $(BACKTRACE_FLAGS) +AM_CXXFLAGS = $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS) $(CORE_CXXFLAGS) $(BACKTRACE_FLAGS) AM_OBJCXXFLAGS = $(AM_CXXFLAGS) AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS) AM_LIBTOOLFLAGS = --preserve-dup-deps @@ -36,16 +36,10 @@ if TARGET_WINDOWS LDFLAGS_WRAP_EXCEPTIONS += -Wl,-wrap,_assert -Wl,-wrap,_wassert else LDFLAGS_WRAP_EXCEPTIONS += -Wl,-wrap,__assert_fail -endif -endif -endif - -if TARGET_WINDOWS -BACKTRACE_LIB = -ldbghelp -lbacktrace -else -BACKTRACE_LIB = -lbacktrace -endif -endif #ENABLE_STACKTRACES +endif # TARGET_WINDOWS +endif # CRASH_HOOKS_WRAPPED_CXX_ABI +endif # ENABLE_CRASH_HOOKS +endif # ENABLE_STACKTRACES BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) $(LEVELDB_CPPFLAGS) BITCOIN_INCLUDES+=-isystem$(srcdir)/dashbls/include -isystem$(srcdir)/dashbls/depends/relic/include -isystem$(srcdir)/dashbls/depends/minialloc/include @@ -1028,7 +1022,7 @@ bitcoin_bin_ldadd = \ $(LIBMEMENV) \ $(LIBSECP256K1) -bitcoin_bin_ldadd += $(BACKTRACE_LIB) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(GMP_LIBS) +bitcoin_bin_ldadd += $(BACKTRACE_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(ZMQ_LIBS) $(GMP_LIBS) dashd_SOURCES = $(bitcoin_daemon_sources) init/bitcoind.cpp dashd_CPPFLAGS = $(bitcoin_bin_cppflags) @@ -1057,7 +1051,7 @@ dash_cli_LDADD = \ $(LIBUNIVALUE) \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) -dash_cli_LDADD += $(BACKTRACE_LIB) $(EVENT_LIBS) $(GMP_LIBS) +dash_cli_LDADD += $(BACKTRACE_LIBS) $(EVENT_LIBS) $(GMP_LIBS) # # dash-tx binary # @@ -1079,7 +1073,7 @@ dash_tx_LDADD = \ $(LIBDASHBLS) \ $(LIBSECP256K1) -dash_tx_LDADD += $(BACKTRACE_LIB) $(GMP_LIBS) +dash_tx_LDADD += $(BACKTRACE_LIBS) $(GMP_LIBS) # # dash-wallet binary # @@ -1097,7 +1091,7 @@ dash_wallet_LDADD = \ $(LIBBITCOIN_CRYPTO) \ $(LIBDASHBLS) \ $(LIBSECP256K1) \ - $(BACKTRACE_LIB) \ + $(BACKTRACE_LIBS) \ $(BOOST_LIBS) \ $(BDB_LIBS) \ $(SQLITE_LIBS) \ diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include index 345752eeddfd..be7bfe2d2dcc 100644 --- a/src/Makefile.bench.include +++ b/src/Makefile.bench.include @@ -81,7 +81,7 @@ bench_bench_dash_LDADD = \ $(MINIUPNPC_LIBS) \ $(NATPMP_LIBS) \ $(GMP_LIBS) \ - $(BACKTRACE_LIB) + $(BACKTRACE_LIBS) if ENABLE_ZMQ bench_bench_dash_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 932b7a2f64ac..488cbb21ff78 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -417,7 +417,7 @@ if ENABLE_ZMQ bitcoin_qt_ldadd += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) endif bitcoin_qt_ldadd += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBDASHBLS) $(LIBUNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BACKTRACE_LIB) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) \ + $(BACKTRACE_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) \ $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) bitcoin_qt_ldflags = $(LDFLAGS_WRAP_EXCEPTIONS) $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) bitcoin_qt_libtoolflags = $(AM_LIBTOOLFLAGS) --tag CXX diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include index 56e9225cb9da..83cdbefc1424 100644 --- a/src/Makefile.qttest.include +++ b/src/Makefile.qttest.include @@ -59,7 +59,7 @@ if ENABLE_ZMQ qt_test_test_dash_qt_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) endif qt_test_test_dash_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBDASHBLS) $(LIBUNIVALUE) $(LIBLEVELDB) \ - $(LIBMEMENV) $(BACKTRACE_LIB) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \ + $(LIBMEMENV) $(BACKTRACE_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \ $(QR_LIBS) $(BDB_LIBS) $(MINIUPNPC_LIBS) $(NATPMP_LIBS) $(SQLITE_LIBS) $(LIBSECP256K1) \ $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) qt_test_test_dash_qt_LDFLAGS = $(LDFLAGS_WRAP_EXCEPTIONS) $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) diff --git a/src/Makefile.test.include b/src/Makefile.test.include index ecce78db38f1..194957d28f2b 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -60,7 +60,7 @@ FUZZ_SUITE_LD_COMMON = \ $(EVENT_LIBS) \ $(EVENT_PTHREADS_LIBS) \ $(GMP_LIBS) \ - $(BACKTRACE_LIB) + $(BACKTRACE_LIBS) if USE_UPNP FUZZ_SUITE_LD_COMMON += $(MINIUPNPC_LIBS) @@ -256,7 +256,7 @@ test_test_dash_LDADD += $(LIBBITCOIN_WALLET) test_test_dash_CPPFLAGS += $(BDB_CPPFLAGS) endif test_test_dash_LDADD += $(LIBBITCOIN_NODE) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \ - $(LIBDASHBLS) $(LIBLEVELDB) $(LIBMEMENV) $(BACKTRACE_LIB) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS) + $(LIBDASHBLS) $(LIBLEVELDB) $(LIBMEMENV) $(BACKTRACE_LIBS) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS) test_test_dash_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) test_test_dash_LDADD += $(BDB_LIBS) $(MINIUPNPC_LIBS) $(SQLITE_LIBS) $(NATPMP_LIBS) $(EVENT_PTHREADS_LIBS) $(EVENT_LIBS) $(GMP_LIBS) diff --git a/src/stacktraces.cpp b/src/stacktraces.cpp index 85a0e15b3aae..3f6262108c97 100644 --- a/src/stacktraces.cpp +++ b/src/stacktraces.cpp @@ -131,7 +131,7 @@ static backtrace_state* GetLibBacktraceState() // libbacktrace is not able to handle the DWARF debuglink in the .exe // but luckily we can just specify the .dbg file here as it's a valid PE/XCOFF file static std::string debugFileName = g_exeFileName + ".dbg"; - static const char* exeFileNamePtr = fs::exists(debugFileName) ? debugFileName.c_str() : g_exeFileName.c_str(); + static const char* exeFileNamePtr = fs::exists(fs::absolute(fs::PathFromString(debugFileName))) ? debugFileName.c_str() : g_exeFileName.c_str(); #else static const char* exeFileNamePtr = g_exeFileName.empty() ? nullptr : g_exeFileName.c_str(); #endif @@ -168,8 +168,6 @@ static __attribute__((noinline)) std::vector GetStackFrames(size_t ski { #ifdef ENABLE_STACKTRACES // We can't use libbacktrace for stack unwinding on Windows as it returns invalid addresses (like 0x1 or 0xffffffff) - static BOOL symInitialized = SymInitialize(GetCurrentProcess(), nullptr, TRUE); - // dbghelp is not thread safe static StdMutex m; StdLockGuard l(m);