core: Initialize the backtracer early on at start
diff --git a/src/backtrace.c b/src/backtrace.c
index 938025b..0526496 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -28,15 +28,30 @@
 #include <unistd.h>
 #include <inttypes.h>
 
-#include "src/log.h"
-#include "src/backtrace.h"
-
 #ifdef HAVE_BACKTRACE_SUPPORT
 #include <execinfo.h>
 #include <elfutils/libdwfl.h>
+#endif
+
+#include "src/log.h"
+#include "src/backtrace.h"
+
+void btd_backtrace_init(void)
+{
+#ifdef HAVE_BACKTRACE_SUPPORT
+	void *frames[1];
+
+	/*
+	 * initialize the backtracer, since the ctor calls dlopen(), which
+	 * calls malloc(), which isn't signal-safe.
+	 */
+	backtrace(frames, 1);
+#endif
+}
 
 void btd_backtrace(uint16_t index)
 {
+#ifdef HAVE_BACKTRACE_SUPPORT
 	char *debuginfo_path = NULL;
 	const Dwfl_Callbacks callbacks = {
 		.find_debuginfo = dwfl_standard_find_debuginfo,
diff --git a/src/backtrace.h b/src/backtrace.h
index 654d67d..b3eef6d 100644
--- a/src/backtrace.h
+++ b/src/backtrace.h
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 
+void btd_backtrace_init(void);
 void btd_backtrace(uint16_t index);
 
 void btd_assertion_message_expr(const char *file, int line,
diff --git a/src/main.c b/src/main.c
index 9124dc5..2001cee 100644
--- a/src/main.c
+++ b/src/main.c
@@ -48,6 +48,7 @@
 #include "gdbus/gdbus.h"
 
 #include "log.h"
+#include "backtrace.h"
 
 #include "lib/uuid.h"
 #include "hcid.h"
@@ -585,6 +586,8 @@
 
 	umask(0077);
 
+	btd_backtrace_init();
+
 	event_loop = g_main_loop_new(NULL, FALSE);
 
 	signal = setup_signalfd();