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();