diff options
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index ce9dc05..4b4386c 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -1443,8 +1443,28 @@ gdb_bfd_lookup_symbol_from_symtab (bfd *abfd, if (match_sym (sym, data)) { + struct gdbarch *gdbarch = target_gdbarch (); + symaddr = sym->value; + + /* Some ELF targets fiddle with addresses of symbols they + consider special. They use minimal symbols to do that + and this is needed for correct breakpoint placement, + but we do not have full data here to build a complete + minimal symbol, so just set the address and let the + targets cope with that. */ + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour + && gdbarch_elf_make_msymbol_special_p (gdbarch)) + { + struct minimal_symbol msym; + + memset (&msym, 0, sizeof (msym)); + SET_MSYMBOL_VALUE_ADDRESS (&msym, symaddr); + gdbarch_elf_make_msymbol_special (gdbarch, sym, &msym); + symaddr = MSYMBOL_VALUE_RAW_ADDRESS (&msym); + } + /* BFD symbols are section relative. */ - symaddr = sym->value + sym->section->vma; + symaddr += sym->section->vma; break; } } |