diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 1c9706dcd2a..2f421a4c266 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -19338,7 +19338,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, apply. */ bound_minimal_symbol found = (lookup_minimal_symbol_linkage - (sym->linkage_name (), objfile)); + (sym->linkage_name (), objfile, false)); if (found.minsym != nullptr) sym->maybe_copied = 1; } diff --git a/gdb/jit.c b/gdb/jit.c index ed3b26cd4bd..48be1c880c9 100644 --- a/gdb/jit.c +++ b/gdb/jit.c @@ -892,7 +892,8 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace) } bound_minimal_symbol desc_symbol - = lookup_minimal_symbol_linkage (jit_descriptor_name, the_objfile); + = lookup_minimal_symbol_linkage (jit_descriptor_name, + the_objfile, true); if (desc_symbol.minsym == NULL || desc_symbol.value_address () == 0) { diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 33eb9072e5f..4e1868c9f87 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -561,7 +561,8 @@ iterate_over_minimal_symbols /* See minsyms.h. */ bound_minimal_symbol -lookup_minimal_symbol_linkage (const char *name, struct objfile *objf) +lookup_minimal_symbol_linkage (const char *name, struct objfile *objf, + bool match_static_type) { unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; @@ -573,7 +574,10 @@ lookup_minimal_symbol_linkage (const char *name, struct objfile *objf) { if (strcmp (msymbol->linkage_name (), name) == 0 && (msymbol->type () == mst_data - || msymbol->type () == mst_bss)) + || msymbol->type () == mst_bss + || (match_static_type + && (msymbol->type () == mst_file_data + || msymbol->type () == mst_file_bss)))) return {msymbol, objfile}; } } @@ -596,7 +600,8 @@ lookup_minimal_symbol_linkage (program_space *pspace, const char *name, continue; bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (name, - objfile); + objfile, + false); if (minsym.minsym != nullptr) return minsym; } diff --git a/gdb/minsyms.h b/gdb/minsyms.h index 9659f30dff8..4e6d5db9139 100644 --- a/gdb/minsyms.h +++ b/gdb/minsyms.h @@ -227,11 +227,12 @@ bound_minimal_symbol lookup_minimal_symbol_text (program_space *pspace, objfiles) for a global (not file-local) minsym whose linkage name is NAME. This is somewhat similar to lookup_minimal_symbol_text, only data symbols (not text symbols) are considered, and a non-NULL - objfile is not accepted. Returns a bound minimal symbol that - matches, or an "empty" bound minimal symbol otherwise. */ + objfile is not accepted. The boolean argument allows matching the + static types of data symbols also. Returns a bound minimal symbol + that matches, or an "empty" bound minimal symbol otherwise. */ -extern bound_minimal_symbol lookup_minimal_symbol_linkage (const char *name, - struct objfile *objf) +extern bound_minimal_symbol lookup_minimal_symbol_linkage + (const char *name, struct objfile *objf, bool match_static_type) ATTRIBUTE_NONNULL (1) ATTRIBUTE_NONNULL (2); /* A variant of lookup_minimal_symbol_linkage that iterates over all diff --git a/gdb/testsuite/gdb.base/jit-elf-so.exp b/gdb/testsuite/gdb.base/jit-elf-so.exp index f28c181fa85..2759c641588 100644 --- a/gdb/testsuite/gdb.base/jit-elf-so.exp +++ b/gdb/testsuite/gdb.base/jit-elf-so.exp @@ -46,7 +46,8 @@ set jit_solib_srcfile ${srcdir}/${subdir}/${jit_solib_basename}.c # On failure, return -1. proc compile_jit_dlmain {options} { global main_loader_srcfile main_loader_binfile main_loader_basename - set options [concat $options debug] + set options [concat $options debug \ + additional_flags=-DJIT_DESCRIPTOR_LINKAGE="static"] if { [gdb_compile ${main_loader_srcfile} ${main_loader_binfile} \ executable $options] != "" } { @@ -133,7 +134,8 @@ proc one_jit_test {solib_binfiles_target match_str} { # Compile the main code (which loads the JIT objects) as a shared library. if { [compile_jit_elf_main_as_so $main_solib_srcfile $main_solib_binfile \ - {additional_flags="-DMAIN=jit_dl_main"}] < 0 } { + {additional_flags="-DMAIN=jit_dl_main" \ + additional_flags="-DJIT_DESCRIPTOR_LINKAGE=static"}] < 0 } { return } diff --git a/gdb/testsuite/gdb.base/jit-protocol.h b/gdb/testsuite/gdb.base/jit-protocol.h index d143dd6042c..3e85c199c9f 100644 --- a/gdb/testsuite/gdb.base/jit-protocol.h +++ b/gdb/testsuite/gdb.base/jit-protocol.h @@ -26,6 +26,10 @@ #include +#ifndef JIT_DESCRIPTOR_LINKAGE +#define JIT_DESCRIPTOR_LINKAGE +#endif + typedef enum { JIT_NOACTION = 0, @@ -51,7 +55,8 @@ struct jit_descriptor struct jit_code_entry *first_entry; }; -struct jit_descriptor __jit_debug_descriptor = { 1, 0, 0, 0 }; +JIT_DESCRIPTOR_LINKAGE struct jit_descriptor __jit_debug_descriptor + = { 1, 0, 0, 0 }; void __attribute__((noinline)) __jit_debug_register_code() {