diff options
author | Tom Tromey <tromey@adacore.com> | 2025-01-13 10:39:50 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2025-01-28 10:50:50 -0700 |
commit | ae700d95c66340d7e1cfc6b2d72480caed929eb0 (patch) | |
tree | 6d0e5e518d71170d88296f763000c0dc70b97fd5 /gdb | |
parent | d2030a099be65fdcbc21851aa0fffd6dff362fa1 (diff) | |
download | gdb-ae700d95c66340d7e1cfc6b2d72480caed929eb0.zip gdb-ae700d95c66340d7e1cfc6b2d72480caed929eb0.tar.gz gdb-ae700d95c66340d7e1cfc6b2d72480caed929eb0.tar.bz2 |
Fix gdb.ada/import.exp when using mold
We found that the gdb.ada/import.exp test fails when 'mold' is used as
the linker. This happens because mold decides to mark most of the
symbols in the executable as being file-local. I tend to think this
choice, while non-traditional, is probably fine. So, this patch fixes
the problem by changing the relevant Ada code to look for file-local
symbols as well.
Furthermore, there are two overloads of lookup_minimal_symbol_linkage
that both have a final 'bool' parameter -- but with radically
different meanings. This patch somewhat clears up this confusion as
well.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31378
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/dwarf2/ada-imported.c | 3 | ||||
-rw-r--r-- | gdb/minsyms.c | 7 | ||||
-rw-r--r-- | gdb/minsyms.h | 4 | ||||
-rw-r--r-- | gdb/symtab.c | 5 |
4 files changed, 10 insertions, 9 deletions
diff --git a/gdb/dwarf2/ada-imported.c b/gdb/dwarf2/ada-imported.c index eabbab1..1654d58 100644 --- a/gdb/dwarf2/ada-imported.c +++ b/gdb/dwarf2/ada-imported.c @@ -36,7 +36,8 @@ ada_imported_read_variable (struct symbol *symbol, const frame_info_ptr &frame) { const char *name = get_imported_name (symbol); bound_minimal_symbol minsym - = lookup_minimal_symbol_linkage (symbol->objfile ()->pspace (), name, false); + = lookup_minimal_symbol_linkage (symbol->objfile ()->pspace (), name, + true, false); if (minsym.minsym == nullptr) error (_("could not find imported name %s"), name); return value_at (symbol->type (), minsym.value_address ()); diff --git a/gdb/minsyms.c b/gdb/minsyms.c index 4e1868c..7b03e38 100644 --- a/gdb/minsyms.c +++ b/gdb/minsyms.c @@ -589,7 +589,7 @@ lookup_minimal_symbol_linkage (const char *name, struct objfile *objf, bound_minimal_symbol lookup_minimal_symbol_linkage (program_space *pspace, const char *name, - bool only_main) + bool match_static_type, bool only_main) { for (objfile *objfile : pspace->objfiles ()) { @@ -599,9 +599,8 @@ lookup_minimal_symbol_linkage (program_space *pspace, const char *name, if (only_main && (objfile->flags & OBJF_MAINLINE) == 0) continue; - bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (name, - objfile, - false); + bound_minimal_symbol minsym + = lookup_minimal_symbol_linkage (name, objfile, match_static_type); if (minsym.minsym != nullptr) return minsym; } diff --git a/gdb/minsyms.h b/gdb/minsyms.h index 3eea558..2327a1b 100644 --- a/gdb/minsyms.h +++ b/gdb/minsyms.h @@ -240,8 +240,8 @@ extern bound_minimal_symbol lookup_minimal_symbol_linkage OBJF_MAINLINE will be considered. */ extern bound_minimal_symbol lookup_minimal_symbol_linkage - (program_space *pspace, const char *name, bool only_main) - ATTRIBUTE_NONNULL (1); + (program_space *pspace, const char *name, bool match_static_type, + bool only_main) ATTRIBUTE_NONNULL (1); /* Look through all the current minimal symbol tables and find the first minimal symbol that matches NAME and PC. If OBJF is non-NULL, diff --git a/gdb/symtab.c b/gdb/symtab.c index ab29b59..c8bcab7 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -6817,7 +6817,7 @@ symbol::get_maybe_copied_address () const const char *linkage_name = this->linkage_name (); bound_minimal_symbol minsym = lookup_minimal_symbol_linkage (this->objfile ()->pspace (), linkage_name, - false); + false, false); if (minsym.minsym != nullptr) return minsym.value_address (); @@ -6834,7 +6834,8 @@ minimal_symbol::get_maybe_copied_address (objfile *objf) const const char *linkage_name = this->linkage_name (); bound_minimal_symbol found - = lookup_minimal_symbol_linkage (objf->pspace (), linkage_name, true); + = lookup_minimal_symbol_linkage (objf->pspace (), linkage_name, + false, true); if (found.minsym != nullptr) return found.value_address (); |