+2013-07-22  Doug Evans  <dje@google.com>
+
+       * exec.h (remove_target_sections): Delete arg abfd.
+       * exec.c (remove_target_sections): Delete arg abfd.
+       (exec_close): Update call to remove_target_sections.
+       * solib.c (update_solib_list): Ditto.
+       (reload_shared_libraries_1): Ditto.
+       (clear_solib): Ditto, and unconditionally call remove_target_sections.
+
 2013-07-22  Tom Tromey  <tromey@redhat.com>
 
        * solib-som.c (som_open_symbol_file_object): Call do_cleanups.
 
       exec_bfd = NULL;
       exec_bfd_mtime = 0;
 
-      remove_target_sections (&exec_bfd, abfd);
+      remove_target_sections (&exec_bfd);
     }
 }
 
   if (!(aflag & SEC_ALLOC))
     return;
 
-  (*table_pp)->key = NULL;
+  (*table_pp)->owner = NULL;
   (*table_pp)->the_bfd_section = asect;
   (*table_pp)->addr = bfd_section_vma (abfd, asect);
   (*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
    current set of target sections.  */
 
 void
-add_target_sections (void *key,
+add_target_sections (void *owner,
                     struct target_section *sections,
                     struct target_section *sections_end)
 {
       for (i = 0; i < count; ++i)
        {
          table->sections[space + i] = sections[i];
-         table->sections[space + i].key = key;
+         table->sections[space + i].owner = owner;
        }
 
       /* If these are the first file sections we can provide memory
     }
 }
 
-/* Remove all target sections taken from ABFD.  */
+/* Remove all target sections owned by OWNER.
+   OWNER must be the same value passed to add_target_sections.  */
 
 void
-remove_target_sections (void *key, bfd *abfd)
+remove_target_sections (void *owner)
 {
   struct target_section *src, *dest;
   struct target_section_table *table = current_target_sections;
 
+  gdb_assert (owner != NULL);
+
   dest = table->sections;
   for (src = table->sections; src < table->sections_end; src++)
-    if (src->key != key || src->the_bfd_section->owner != abfd)
+    if (src->owner != owner)
       {
        /* Keep this section.  */
        if (dest < src)
 
 /* Set the loaded address of a section.  */
 extern void exec_set_section_address (const char *, int, CORE_ADDR);
 
-/* Remove all target sections taken from ABFD.  */
+/* Remove all target sections owned by OWNER.  */
 
-extern void remove_target_sections (void *key, bfd *abfd);
+extern void remove_target_sections (void *owner);
 
 /* Add the sections array defined by [SECTIONS..SECTIONS_END[ to the
    current set of target sections.  */
 
-extern void add_target_sections (void *key,
+extern void add_target_sections (void *owner,
                                 struct target_section *sections,
                                 struct target_section *sections_end);
 
 
 
          /* Some targets' section tables might be referring to
             sections from so->abfd; remove them.  */
-         remove_target_sections (gdb, gdb->abfd);
+         remove_target_sections (gdb);
 
          free_so (gdb);
          gdb = *gdb_link;
 
       so_list_head = so->next;
       observer_notify_solib_unloaded (so);
-      if (so->abfd)
-       remove_target_sections (so, so->abfd);
+      remove_target_sections (so);
       free_so (so);
     }
 
          if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
              && !solib_used (so))
            free_objfile (so->objfile);
-         remove_target_sections (so, so->abfd);
+         remove_target_sections (so);
          clear_so (so);
        }
 
 
 
     struct bfd_section *the_bfd_section;
 
-    /* A given BFD may appear multiple times in the target section
-       list, so each BFD is associated with a given key.  The key is
-       just some convenient pointer that can be used to differentiate
-       the BFDs.  These are managed only by convention.  */
-    void *key;
+    /* The "owner" of the section.
+       It can be any unique value.  It is set by add_target_sections
+       and used by remove_target_sections.
+       For example, for executables it is a pointer to exec_bfd and
+       for shlibs it is the so_list pointer.  */
+    void *owner;
   };
 
 /* Holds an array of target sections.  Defined by [SECTIONS..SECTIONS_END[.  */