Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / solib.c
index 90ea45410b78b259d0595fbedc70c51a7a4036c8..98d5cfd405fb6dddae695f7691a7bb63d6740ae7 100644 (file)
@@ -1,6 +1,6 @@
 /* Handle shared libraries for GDB, the GNU Debugger.
 
-   Copyright (C) 1990-2014 Free Software Foundation, Inc.
+   Copyright (C) 1990-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -25,7 +25,6 @@
 #include "bfd.h"
 #include "symfile.h"
 #include "objfiles.h"
-#include "exceptions.h"
 #include "gdbcore.h"
 #include "command.h"
 #include "target.h"
@@ -603,8 +602,6 @@ master_so_list (void)
 int
 solib_read_symbols (struct so_list *so, int flags)
 {
-  const int from_tty = flags & SYMFILE_VERBOSE;
-
   if (so->symbols_loaded)
     {
       /* If needed, we've already warned in our caller.  */
@@ -648,11 +645,7 @@ solib_read_symbols (struct so_list *so, int flags)
                                            " library symbols for %s:\n"),
                           so->so_name);
       else
-       {
-         if (print_symbol_loading_p (from_tty, 0, 1))
-           printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
-         so->symbols_loaded = 1;
-       }
+       so->symbols_loaded = 1;
       return 1;
     }
 
@@ -1411,11 +1404,11 @@ show_auto_solib_add (struct ui_file *file, int from_tty,
    the library-specific handler if it is installed for the current target.  */
 
 struct symbol *
-solib_global_lookup (const struct objfile *objfile,
+solib_global_lookup (struct objfile *objfile,
                     const char *name,
                     const domain_enum domain)
 {
-  const struct target_so_ops *ops = solib_ops (target_gdbarch ());
+  const struct target_so_ops *ops = solib_ops (get_objfile_arch (objfile));
 
   if (ops->lookup_lib_global_symbol != NULL)
     return ops->lookup_lib_global_symbol (objfile, name, domain);
@@ -1450,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;
            }
        }
This page took 0.025764 seconds and 4 git commands to generate.