From f69f2a995d0c5c6bc44fd485a7f5d3b390f26fc4 Mon Sep 17 00:00:00 2001 From: Jan Tojnar Date: Sat, 25 Apr 2026 23:01:23 +0200 Subject: [PATCH] libbacktrace: Allow configuring debug dir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On platforms that do not use FHS like NixOS or GNU Guix, the build-id directories are not under `/usr/lib/debug`. Let’s add `--with-separate-debug-dir` configure flag so that the path can be changed. The same flag is supported by gdb: https://github.com/bminor/binutils-gdb/blob/095f84c7e3cf85cd68c657c46b80be078f336bc9/gdb/configure.ac#L113-L115 --- Makefile.am | 15 ++++++++------- configure.ac | 8 ++++++++ elf.c | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Makefile.am b/Makefile.am index 7b32e23..51431b9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,7 +33,8 @@ ACLOCAL_AMFLAGS = -I config AM_CPPFLAGS = -AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG) +AM_CFLAGS = $(EXTRA_FLAGS) $(WARN_FLAGS) $(PIC_FLAG) \ + -DSYSTEM_DEBUG_DIR=\"$(SEPARATE_DEBUG_DIR)\" include_HEADERS = backtrace.h backtrace-supported.h @@ -136,7 +137,7 @@ libbacktrace_noformat_la_DEPENDENCIES = $(libbacktrace_noformat_la_LIBADD) if HAVE_ELF if HAVE_OBJCOPY_DEBUGLINK -TEST_BUILD_ID_DIR=$(abs_builddir)/usr/lib/debug/.build-id/ +TEST_DEBUG_DIR=$(abs_builddir)/usr/lib/debug check_LTLIBRARIES += libbacktrace_elf_for_test.la @@ -145,8 +146,8 @@ libbacktrace_elf_for_test_la_LIBADD = $(BACKTRACE_FILE) elf_for_test.lo \ $(VIEW_FILE) $(ALLOC_FILE) elf_for_test.c: elf.c - SEARCH='^#define SYSTEM_BUILD_ID_DIR.*$$'; \ - REPLACE="#define SYSTEM_BUILD_ID_DIR \"$(TEST_BUILD_ID_DIR)\""; \ + SEARCH='^#define BUILD_ID_DIR.*$$'; \ + REPLACE='\0\n#undef SYSTEM_DEBUG_DIR\n#define SYSTEM_DEBUG_DIR "$(TEST_DEBUG_DIR)"'; \ $(SED) "s%$$SEARCH%$$REPLACE%" \ $< \ > $@.tmp @@ -484,13 +485,13 @@ endif HAVE_OBJCOPY_DEBUGLINK %_buildid: % ./install-debuginfo-for-buildid.sh \ - "$(TEST_BUILD_ID_DIR)" \ + "$(TEST_DEBUG_DIR)/.build-id" \ $< $(OBJCOPY) --strip-debug $< $@ %_buildidfull: % ./install-debuginfo-for-buildid.sh \ - "$(TEST_BUILD_ID_DIR)" \ + "$(TEST_DEBUG_DIR)/.build-id" \ $< $(OBJCOPY) --strip-all $< $@ @@ -621,7 +622,7 @@ MAKETESTS += m2test_minidebug2 $(XZ) $<.mdbg2 $(OBJCOPY) --add-section .gnu_debugdata=$<.mdbg2.xz $<.dbg2 $(OBJCOPY) --add-section .gnu_debugdata=$<.mdbg2.xz $<.strip2 - $(SHELL) ./install-debuginfo-for-buildid.sh $(TEST_BUILD_ID_DIR) $<.dbg2 + $(SHELL) ./install-debuginfo-for-buildid.sh "$(TEST_DEBUG_DIR)/.build-id" $<.dbg2 mv $<.strip2 $@ endif HAVE_OBJCOPY_DEBUGLINK diff --git a/configure.ac b/configure.ac index 2267cc5..15cdc6e 100644 --- a/configure.ac +++ b/configure.ac @@ -67,6 +67,14 @@ AM_MAINTAINER_MODE AC_ARG_WITH(target-subdir, [ --with-target-subdir=SUBDIR Configuring in a subdirectory for target]) +AC_ARG_WITH(separate-debug-dir, +[ --with-separate-debug-dir=DEBUGDIR Look for global separate debug info in this path @<:@LIBDIR/debug@:>@], +[separate_debug_dir=$withval], +[separate_debug_dir=$libdir/debug]) + +SEPARATE_DEBUG_DIR=$separate_debug_dir +AC_SUBST(SEPARATE_DEBUG_DIR) + # We must force CC to /not/ be precious variables; otherwise # the wrong, non-multilib-adjusted value will be used in multilibs. # As a side effect, we have to subst CFLAGS ourselves. diff --git a/elf.c b/elf.c index e93729d..4765fae 100644 --- a/elf.c +++ b/elf.c @@ -857,7 +857,7 @@ elf_readlink (struct backtrace_state *state, const char *filename, } } -#define SYSTEM_BUILD_ID_DIR "/usr/lib/debug/.build-id/" +#define BUILD_ID_DIR "/.build-id/" /* Open a separate debug info file, using the build ID to find it. Returns an open file descriptor, or -1. @@ -871,7 +871,7 @@ elf_open_debugfile_by_buildid (struct backtrace_state *state, backtrace_error_callback error_callback, void *data) { - const char * const prefix = SYSTEM_BUILD_ID_DIR; + const char * const prefix = SYSTEM_DEBUG_DIR BUILD_ID_DIR; const size_t prefix_len = strlen (prefix); const char * const suffix = ".debug"; const size_t suffix_len = strlen (suffix); -- 2.51.2