@@ -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
867867static 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 );
@@ -6936,27 +6936,47 @@ elf_add (struct backtrace_state *state, const char *filename, int descriptor,
69366936 if (buildid_data != NULL )
69376937 {
69386938 int d ;
6939+ char * debug_directories ;
6940+ char * debug_dir ;
69396941
6940- d = elf_open_debugfile_by_buildid (state , buildid_data , buildid_size ,
6941- error_callback , data );
6942- if (d >= 0 )
6943- {
6944- int ret ;
6942+ debug_directories = malloc (strlen (SYSTEM_DEBUG_DIR ) + 1 );
6943+ strcpy (debug_directories , SYSTEM_DEBUG_DIR );
69456944
6946- elf_release_view (state , & buildid_view , error_callback , data );
6947- if (debuglink_view_valid )
6948- elf_release_view (state , & debuglink_view , error_callback , data );
6949- if (debugaltlink_view_valid )
6950- elf_release_view (state , & debugaltlink_view , error_callback , data );
6951- ret = elf_add (state , "" , d , NULL , 0 , base_address , error_callback ,
6952- data , fileline_fn , found_sym , found_dwarf , NULL , 0 ,
6953- 1 , NULL , 0 );
6954- if (ret < 0 )
6955- backtrace_close (d , error_callback , data );
6956- else if (descriptor >= 0 )
6957- backtrace_close (descriptor , error_callback , data );
6958- return ret ;
6959- }
6945+ debug_dir = strtok (debug_directories , ":" );
6946+ while (debug_dir != NULL )
6947+ {
6948+ char prefix [strlen (debug_dir ) + strlen (BUILD_ID_DIR ) + 1 ];
6949+ strcpy (prefix , debug_dir );
6950+ strcat (prefix , BUILD_ID_DIR );
6951+
6952+ d = elf_open_debugfile_by_buildid (prefix , state , buildid_data , buildid_size ,
6953+ error_callback , data );
6954+
6955+ if (d >= 0 )
6956+ {
6957+ int ret ;
6958+
6959+ free (debug_directories );
6960+
6961+ elf_release_view (state , & buildid_view , error_callback , data );
6962+ if (debuglink_view_valid )
6963+ elf_release_view (state , & debuglink_view , error_callback , data );
6964+ if (debugaltlink_view_valid )
6965+ elf_release_view (state , & debugaltlink_view , error_callback , data );
6966+ ret = elf_add (state , "" , d , NULL , 0 , base_address , error_callback ,
6967+ data , fileline_fn , found_sym , found_dwarf , NULL , 0 ,
6968+ 1 , NULL , 0 );
6969+ if (ret < 0 )
6970+ backtrace_close (d , error_callback , data );
6971+ else if (descriptor >= 0 )
6972+ backtrace_close (descriptor , error_callback , data );
6973+ return ret ;
6974+ }
6975+
6976+ debug_dir = strtok (NULL , ":" );
6977+ }
6978+
6979+ free (debug_directories );
69606980 }
69616981
69626982 if (buildid_view_valid )
0 commit comments