Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 94 additions & 35 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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"],,,)

Expand Down Expand Up @@ -968,6 +945,9 @@ case $host in
*linux*)
TARGET_OS=linux
;;
*bsd*)
TARGET_OS=bsd
;;
esac

if test "$use_extended_functional_tests" != "no"; then
Expand Down Expand Up @@ -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 <unistd.h>
Expand Down Expand Up @@ -1285,15 +1350,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
[ 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 <unistd.h>]],
[[ fdatasync(0); ]])],
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
4 changes: 2 additions & 2 deletions depends/packages/backtrace.mk
Original file line number Diff line number Diff line change
@@ -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)
Expand Down
28 changes: 11 additions & 17 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 #
Expand All @@ -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 #
Expand All @@ -1097,7 +1091,7 @@ dash_wallet_LDADD = \
$(LIBBITCOIN_CRYPTO) \
$(LIBDASHBLS) \
$(LIBSECP256K1) \
$(BACKTRACE_LIB) \
$(BACKTRACE_LIBS) \
$(BOOST_LIBS) \
$(BDB_LIBS) \
$(SQLITE_LIBS) \
Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.bench.include
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.qt.include
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/Makefile.qttest.include
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 1 addition & 3 deletions src/stacktraces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -168,8 +168,6 @@ static __attribute__((noinline)) std::vector<uint64_t> 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);
Expand Down
Loading