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