introduce minimal_symbol_upper_bound
[deliverable/binutils-gdb.git] / gdb / solib-aix.c
index 4672b588ce34c0186c16ba3df459f540fb574d3b..78d2753d46780fe90a59f05eca6b8572813b73c2 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2013 Free Software Foundation, Inc.
+/* Copyright (C) 2013-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -115,7 +115,7 @@ get_solib_aix_inferior_data (struct inferior *inf)
   data = inferior_data (inf, solib_aix_inferior_data_handle);
   if (data == NULL)
     {
-      data = XZALLOC (struct solib_aix_inferior_data);
+      data = XCNEW (struct solib_aix_inferior_data);
       set_inferior_data (inf, solib_aix_inferior_data_handle, data);
     }
 
@@ -161,7 +161,7 @@ library_list_start_library (struct gdb_xml_parser *parser,
                            VEC (gdb_xml_value_s) *attributes)
 {
   VEC (lm_info_p) **list = user_data;
-  struct lm_info *item = XZALLOC (struct lm_info);
+  struct lm_info *item = XCNEW (struct lm_info);
   struct gdb_xml_value *attr;
 
   attr = xml_find_attribute (attributes, "name");
@@ -390,8 +390,8 @@ static void
 solib_aix_relocate_section_addresses (struct so_list *so,
                                      struct target_section *sec)
 {
-  bfd *abfd = sec->bfd;
   struct bfd_section *bfd_sect = sec->the_bfd_section;
+  bfd *abfd = bfd_sect->owner;
   const char *section_name = bfd_section_name (abfd, bfd_sect);
   struct lm_info *info = so->lm_info;
 
@@ -432,16 +432,6 @@ solib_aix_relocate_section_addresses (struct so_list *so,
   else
     {
       /* All other sections should not be relocated.  */
-      /* FIXME: GDB complains that the .loader section sometimes
-        overlaps with other sections (Eg: the .data section).
-        As far as I can tell, the loader section had the LOAD flag
-        set, but not the RELOC.  So it should not be relocated.
-        There seems to be a problem there, and maybe it has to do
-        with setting sec->addr to 0 (when the vma is indeed 0).
-        But even if there wasn't, the problem then becomes the fact
-        that many shared objects inside shared libraries have
-        a .loader section whose vma is 0, thus also triggering
-        an overlap warning.  */
       sec->addr = bfd_section_vma (abfd, bfd_sect);
       sec->endaddr = sec->addr + bfd_section_size (abfd, bfd_sect);
     }
@@ -480,7 +470,7 @@ solib_aix_get_section_offsets (struct objfile *objfile,
   bfd *abfd = objfile->obfd;
   int i;
 
-  offsets = XCALLOC (objfile->num_sections, struct section_offsets);
+  offsets = XCNEWVEC (struct section_offsets, objfile->num_sections);
 
   /* .text */
 
@@ -585,7 +575,7 @@ solib_aix_current_sos (void)
      to the main executable, not a shared library.  */
   for (ix = 1; VEC_iterate (lm_info_p, library_list, ix, info); ix++)
     {
-      struct so_list *new_solib = XZALLOC (struct so_list);
+      struct so_list *new_solib = XCNEW (struct so_list);
       char *so_name;
 
       if (info->member_name == NULL)
@@ -657,7 +647,7 @@ solib_aix_bfd_open (char *pathname)
   int filename_len;
   char *member_name;
   bfd *archive_bfd, *object_bfd;
-  struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
+  struct cleanup *cleanup;
 
   if (pathname[path_len - 1] != ')')
     return solib_bfd_open (pathname);
@@ -675,7 +665,7 @@ solib_aix_bfd_open (char *pathname)
   filename_len = sep - pathname;
 
   filename = xstrprintf ("%.*s", filename_len, pathname);
-  make_cleanup (xfree, filename);
+  cleanup = make_cleanup (xfree, filename);
   member_name = xstrprintf ("%.*s", path_len - filename_len - 2, sep + 1);
   make_cleanup (xfree, member_name);
 
@@ -734,6 +724,13 @@ solib_aix_bfd_open (char *pathname)
       return NULL;
     }
 
+  /* Override the returned bfd's name with our synthetic name in order
+     to allow commands listing all shared libraries to display that
+     synthetic name.  Otherwise, we would only be displaying the name
+     of the archive member object.  */
+  xfree (bfd_get_filename (object_bfd));
+  object_bfd->filename = xstrdup (pathname);
+
   gdb_bfd_unref (archive_bfd);
   do_cleanups (cleanup);
   return object_bfd;
@@ -775,7 +772,7 @@ solib_aix_get_toc_value (CORE_ADDR pc)
   if (data_osect == NULL)
     error (_("unable to find TOC entry for pc %s "
             "(%s has no data section)"),
-          core_addr_to_string (pc), pc_osect->objfile->name);
+          core_addr_to_string (pc), objfile_name (pc_osect->objfile));
 
   result = (obj_section_addr (data_osect)
            + xcoff_get_toc_offset (pc_osect->objfile));
This page took 0.031649 seconds and 4 git commands to generate.