Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 48addfb

Browse files
committedMar 2, 2024
libbacktrace: Support multiple build id directories
gdb supports multiple debug directories separated by colons: https://github.com/bminor/binutils-gdb/blob/fcbfb25dcca625a7f999ec51d48b6fc3a32123c3/gdb/build-id.c#L136-L142 This is useful for example when using dwarffs in addition to debug data installed using distribution’s package manager.
1 parent d518d40 commit 48addfb

File tree

1 file changed

+36
-21
lines changed

1 file changed

+36
-21
lines changed
 

‎elf.c

+36-21
Original file line numberDiff line numberDiff line change
@@ -865,12 +865,12 @@ elf_readlink (struct backtrace_state *state, const char *filename,
865865
when the build ID is known is in /usr/lib/debug/.build-id. */
866866

867867
static int
868-
elf_open_debugfile_by_buildid (struct backtrace_state *state,
868+
elf_open_debugfile_by_buildid (const char * const prefix,
869+
struct backtrace_state *state,
869870
const char *buildid_data, size_t buildid_size,
870871
backtrace_error_callback error_callback,
871872
void *data)
872873
{
873-
const char * const prefix = SYSTEM_DEBUG_DIR BUILD_ID_DIR;
874874
const size_t prefix_len = strlen (prefix);
875875
const char * const suffix = ".debug";
876876
const size_t suffix_len = strlen (suffix);
@@ -6947,27 +6947,42 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
69476947
if (buildid_data != NULL)
69486948
{
69496949
int d;
6950+
char debug_directories[strlen(SYSTEM_DEBUG_DIR) + 1];
6951+
char *debug_dir;
69506952

6951-
d = elf_open_debugfile_by_buildid (state, buildid_data, buildid_size,
6952-
error_callback, data);
6953-
if (d >= 0)
6954-
{
6955-
int ret;
6953+
strcpy(debug_directories, SYSTEM_DEBUG_DIR);
69566954

6957-
elf_release_view (state, &buildid_view, error_callback, data);
6958-
if (debuglink_view_valid)
6959-
elf_release_view (state, &debuglink_view, error_callback, data);
6960-
if (debugaltlink_view_valid)
6961-
elf_release_view (state, &debugaltlink_view, error_callback, data);
6962-
ret = elf_add (state, "", d, NULL, 0, base_address, opd,
6963-
error_callback, data, fileline_fn, found_sym,
6964-
found_dwarf, NULL, 0, 1, NULL, 0);
6965-
if (ret < 0)
6966-
backtrace_close (d, error_callback, data);
6967-
else if (descriptor >= 0)
6968-
backtrace_close (descriptor, error_callback, data);
6969-
return ret;
6970-
}
6955+
debug_dir = strtok (debug_directories, ":");
6956+
while (debug_dir != NULL)
6957+
{
6958+
char prefix[strlen(debug_dir) + strlen(BUILD_ID_DIR) + 1];
6959+
strcpy(prefix, debug_dir);
6960+
strcat(prefix, BUILD_ID_DIR);
6961+
6962+
d = elf_open_debugfile_by_buildid (prefix, state, buildid_data, buildid_size,
6963+
error_callback, data);
6964+
6965+
if (d >= 0)
6966+
{
6967+
int ret;
6968+
6969+
elf_release_view (state, &buildid_view, error_callback, data);
6970+
if (debuglink_view_valid)
6971+
elf_release_view (state, &debuglink_view, error_callback, data);
6972+
if (debugaltlink_view_valid)
6973+
elf_release_view (state, &debugaltlink_view, error_callback, data);
6974+
ret = elf_add (state, "", d, NULL, 0, base_address, opd,
6975+
error_callback, data, fileline_fn, found_sym,
6976+
found_dwarf, NULL, 0, 1, NULL, 0);
6977+
if (ret < 0)
6978+
backtrace_close (d, error_callback, data);
6979+
else if (descriptor >= 0)
6980+
backtrace_close (descriptor, error_callback, data);
6981+
return ret;
6982+
}
6983+
6984+
debug_dir = strtok (NULL, ":");
6985+
}
69716986
}
69726987

69736988
if (buildid_view_valid)

0 commit comments

Comments
 (0)
Please sign in to comment.