lol
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 24.05-pre 101 lines 3.8 kB view raw
1From de122af5382d8017cae63bdee946206c6c6c23ab Mon Sep 17 00:00:00 2001 2From: Jan Tojnar <jtojnar@gmail.com> 3Date: Sat, 24 Dec 2022 20:19:27 +0100 4Subject: [PATCH 3/4] libbacktrace: Support multiple build id directories 5MIME-Version: 1.0 6Content-Type: text/plain; charset=UTF-8 7Content-Transfer-Encoding: 8bit 8 9gdb supports multiple debug directories separated by colons: 10https://github.com/bminor/binutils-gdb/blob/fcbfb25dcca625a7f999ec51d48b6fc3a32123c3/gdb/build-id.c#L136-L142 11 12This is useful for example when using dwarffs in addition 13to debug data installed using distribution’s package manager. 14--- 15 elf.c | 57 ++++++++++++++++++++++++++++++++++++--------------------- 16 1 file changed, 36 insertions(+), 21 deletions(-) 17 18diff --git a/elf.c b/elf.c 19index 8b1189c..65c647a 100644 20--- a/elf.c 21+++ b/elf.c 22@@ -865,12 +865,12 @@ elf_readlink (struct backtrace_state *state, const char *filename, 23 when the build ID is known is in /usr/lib/debug/.build-id. */ 24 25 static int 26-elf_open_debugfile_by_buildid (struct backtrace_state *state, 27+elf_open_debugfile_by_buildid (const char * const prefix, 28+ struct backtrace_state *state, 29 const char *buildid_data, size_t buildid_size, 30 backtrace_error_callback error_callback, 31 void *data) 32 { 33- const char * const prefix = SYSTEM_DEBUG_DIR BUILD_ID_DIR; 34 const size_t prefix_len = strlen (prefix); 35 const char * const suffix = ".debug"; 36 const size_t suffix_len = strlen (suffix); 37@@ -6936,27 +6936,42 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor, 38 if (buildid_data != NULL) 39 { 40 int d; 41+ char debug_directories[strlen(SYSTEM_DEBUG_DIR) + 1]; 42+ char *debug_dir; 43 44- d = elf_open_debugfile_by_buildid (state, buildid_data, buildid_size, 45- error_callback, data); 46- if (d >= 0) 47- { 48- int ret; 49+ strcpy(debug_directories, SYSTEM_DEBUG_DIR); 50 51- elf_release_view (state, &buildid_view, error_callback, data); 52- if (debuglink_view_valid) 53- elf_release_view (state, &debuglink_view, error_callback, data); 54- if (debugaltlink_view_valid) 55- elf_release_view (state, &debugaltlink_view, error_callback, data); 56- ret = elf_add (state, "", d, NULL, 0, base_address, error_callback, 57- data, fileline_fn, found_sym, found_dwarf, NULL, 0, 58- 1, NULL, 0); 59- if (ret < 0) 60- backtrace_close (d, error_callback, data); 61- else if (descriptor >= 0) 62- backtrace_close (descriptor, error_callback, data); 63- return ret; 64- } 65+ debug_dir = strtok (debug_directories, ":"); 66+ while (debug_dir != NULL) 67+ { 68+ char prefix[strlen(debug_dir) + strlen(BUILD_ID_DIR) + 1]; 69+ strcpy(prefix, debug_dir); 70+ strcat(prefix, BUILD_ID_DIR); 71+ 72+ d = elf_open_debugfile_by_buildid (prefix, state, buildid_data, buildid_size, 73+ error_callback, data); 74+ 75+ if (d >= 0) 76+ { 77+ int ret; 78+ 79+ elf_release_view (state, &buildid_view, error_callback, data); 80+ if (debuglink_view_valid) 81+ elf_release_view (state, &debuglink_view, error_callback, data); 82+ if (debugaltlink_view_valid) 83+ elf_release_view (state, &debugaltlink_view, error_callback, data); 84+ ret = elf_add (state, "", d, NULL, 0, base_address, error_callback, 85+ data, fileline_fn, found_sym, found_dwarf, NULL, 0, 86+ 1, NULL, 0); 87+ if (ret < 0) 88+ backtrace_close (d, error_callback, data); 89+ else if (descriptor >= 0) 90+ backtrace_close (descriptor, error_callback, data); 91+ return ret; 92+ } 93+ 94+ debug_dir = strtok (NULL, ":"); 95+ } 96 } 97 98 if (buildid_view_valid) 99-- 1002.38.1 101