X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-aix.c;h=78d2753d46780fe90a59f05eca6b8572813b73c2;hb=50e65b1713256487d50514b50b38b3fd1080b93e;hp=4672b588ce34c0186c16ba3df459f540fb574d3b;hpb=060cfbef397769f935df461cb90d237c0783045a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c index 4672b588ce..78d2753d46 100644 --- a/gdb/solib-aix.c +++ b/gdb/solib-aix.c @@ -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));