static void exec_close(quitting) { register struct vmap *vp, *nxt; struct objfile *obj; for (nxt = vmap; vp = nxt; ) { nxt = vp->nxt; /* if there is an objfile associated with this bfd, free_objfile() will do proper cleanup of objfile *and* bfd. */ if (obj = lookup_objfile_bfd (vp->bfd)) free_objfile (obj); else bfd_close(vp->bfd); free_named_symtabs(vp->name); free(vp); } vmap = 0; if (exec_bfd) { bfd_close (exec_bfd); exec_bfd = NULL; } if (exec_ops.to_sections) { free (exec_ops.to_sections); exec_ops.to_sections = NULL; exec_ops.to_sections_end = NULL; } }
void free_all_objfiles (void) { struct objfile *objfile, *temp; ALL_OBJFILES_SAFE (objfile, temp) { free_objfile (objfile); }
static void exec_close (int quitting) { int need_symtab_cleanup = 0; struct vmap *vp, *nxt; for (nxt = vmap; nxt != NULL;) { vp = nxt; nxt = vp->nxt; /* if there is an objfile associated with this bfd, free_objfile() will do proper cleanup of objfile *and* bfd. */ if (vp->objfile) { free_objfile (vp->objfile); need_symtab_cleanup = 1; } else if (vp->bfd != exec_bfd) /* FIXME-leak: We should be freeing vp->name too, I think. */ if (!bfd_close (vp->bfd)) warning (_("cannot close \"%s\": %s"), vp->name, bfd_errmsg (bfd_get_error ())); /* FIXME: This routine is #if 0'd in symfile.c. What should we be doing here? Should we just free everything in vp->objfile->symtabs? Should free_objfile do that? FIXME-as-well: free_objfile already free'd vp->name, so it isn't valid here. */ free_named_symtabs (vp->name); xfree (vp); } vmap = NULL; if (exec_bfd) { char *name = bfd_get_filename (exec_bfd); if (!bfd_close (exec_bfd)) warning (_("cannot close \"%s\": %s"), name, bfd_errmsg (bfd_get_error ())); xfree (name); exec_bfd = NULL; exec_bfd_mtime = 0; } if (exec_ops.to_sections) { xfree (exec_ops.to_sections); exec_ops.to_sections = NULL; exec_ops.to_sections_end = NULL; } }
static void exec_close_1 (int quitting) { int need_symtab_cleanup = 0; struct vmap *vp, *nxt; using_exec_ops = 0; for (nxt = vmap; nxt != NULL;) { vp = nxt; nxt = vp->nxt; /* if there is an objfile associated with this bfd, free_objfile() will do proper cleanup of objfile *and* bfd. */ if (vp->objfile) { free_objfile (vp->objfile); need_symtab_cleanup = 1; } else if (vp->bfd != exec_bfd) /* FIXME-leak: We should be freeing vp->name too, I think. */ gdb_bfd_close_or_warn (vp->bfd); xfree (vp); } vmap = NULL; { struct program_space *ss; struct cleanup *old_chain; old_chain = save_current_program_space (); ALL_PSPACES (ss) { set_current_program_space (ss); /* Delete all target sections. */ resize_section_table (current_target_sections, -resize_section_table (current_target_sections, 0)); exec_close (); } do_cleanups (old_chain); } }
static void exec_close_1 (int quitting) { struct vmap *vp, *nxt; using_exec_ops = 0; for (nxt = vmap; nxt != NULL;) { vp = nxt; nxt = vp->nxt; if (vp->objfile) free_objfile (vp->objfile); gdb_bfd_unref (vp->bfd); xfree (vp); } vmap = NULL; { struct program_space *ss; struct cleanup *old_chain; old_chain = save_current_program_space (); ALL_PSPACES (ss) { set_current_program_space (ss); /* Delete all target sections. */ resize_section_table (current_target_sections, -resize_section_table (current_target_sections, 0)); exec_close (); } do_cleanups (old_chain); } }
static void vmap_ldinfo (LdInfo *ldi) { struct stat ii, vi; struct vmap *vp; int got_one, retried; int got_exec_file = 0; uint next; int arch64 = ARCH64 (); /* For each *ldi, see if we have a corresponding *vp. If so, update the mapping, and symbol table. If not, add an entry and symbol table. */ do { char *name = LDI_FILENAME (ldi, arch64); char *memb = name + strlen (name) + 1; int fd = LDI_FD (ldi, arch64); retried = 0; if (fstat (fd, &ii) < 0) { /* The kernel sets ld_info to -1, if the process is still using the object, and the object is removed. Keep the symbol info for the removed object and issue a warning. */ warning (_("%s (fd=%d) has disappeared, keeping its symbols"), name, fd); continue; } retry: for (got_one = 0, vp = vmap; vp; vp = vp->nxt) { struct objfile *objfile; /* First try to find a `vp', which is the same as in ldinfo. If not the same, just continue and grep the next `vp'. If same, relocate its tstart, tend, dstart, dend values. If no such `vp' found, get out of this for loop, add this ldi entry as a new vmap (add_vmap) and come back, find its `vp' and so on... */ /* The filenames are not always sufficient to match on. */ if ((name[0] == '/' && strcmp (name, vp->name) != 0) || (memb[0] && strcmp (memb, vp->member) != 0)) continue; /* See if we are referring to the same file. We have to check objfile->obfd, symfile.c:reread_symbols might have updated the obfd after a change. */ objfile = vp->objfile == NULL ? symfile_objfile : vp->objfile; if (objfile == NULL || objfile->obfd == NULL || bfd_stat (objfile->obfd, &vi) < 0) { warning (_("Unable to stat %s, keeping its symbols"), name); continue; } if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino) continue; if (!retried) close (fd); ++got_one; /* Found a corresponding VMAP. Remap! */ vmap_secs (vp, ldi, arch64); /* The objfile is only NULL for the exec file. */ if (vp->objfile == NULL) got_exec_file = 1; /* relocate symbol table(s). */ vmap_symtab (vp); /* Announce new object files. Doing this after symbol relocation makes aix-thread.c's job easier. */ if (vp->objfile) observer_notify_new_objfile (vp->objfile); /* There may be more, so we don't break out of the loop. */ } /* if there was no matching *vp, we must perforce create the sucker(s) */ if (!got_one && !retried) { add_vmap (ldi); ++retried; goto retry; } } while ((next = LDI_NEXT (ldi, arch64)) && (ldi = (void *) (next + (char *) ldi))); /* If we don't find the symfile_objfile anywhere in the ldinfo, it is unlikely that the symbol file is relocated to the proper address. And we might have attached to a process which is running a different copy of the same executable. */ if (symfile_objfile != NULL && !got_exec_file) { warning (_("Symbol file %s\nis not mapped; discarding it.\n\ If in fact that file has symbols which the mapped files listed by\n\ \"info files\" lack, you can load symbols with the \"symbol-file\" or\n\ \"add-symbol-file\" commands (note that you must take care of relocating\n\ symbols to the proper address)."), symfile_objfile->name); free_objfile (symfile_objfile); gdb_assert (symfile_objfile == NULL); }
static void do_free_objfile_cleanup (void *obj) { free_objfile (obj); }
void free_objfile (struct objfile *objfile) { if (objfile->separate_debug_objfile) { free_objfile (objfile->separate_debug_objfile); } if (objfile->separate_debug_objfile_backlink) { /* We freed the separate debug file, make sure the base objfile doesn't reference it. */ objfile->separate_debug_objfile_backlink->separate_debug_objfile = NULL; } /* First do any symbol file specific actions required when we are finished with a particular symbol file. Note that if the objfile is using reusable symbol information (via mmalloc) then each of these routines is responsible for doing the correct thing, either freeing things which are valid only during this particular gdb execution, or leaving them to be reused during the next one. */ if (objfile->sf != NULL) { (*objfile->sf->sym_finish) (objfile); } /* We always close the bfd. */ if (objfile->obfd != NULL) { char *name = bfd_get_filename (objfile->obfd); if (!bfd_close (objfile->obfd)) warning ("cannot close \"%s\": %s", name, bfd_errmsg (bfd_get_error ())); xfree (name); } /* Remove it from the chain of all objfiles. */ unlink_objfile (objfile); /* If we are going to free the runtime common objfile, mark it as unallocated. */ if (objfile == rt_common_objfile) rt_common_objfile = NULL; /* Before the symbol table code was redone to make it easier to selectively load and remove information particular to a specific linkage unit, gdb used to do these things whenever the monolithic symbol table was blown away. How much still needs to be done is unknown, but we play it safe for now and keep each action until it is shown to be no longer needed. */ /* I *think* all our callers call clear_symtab_users. If so, no need to call this here. */ clear_pc_function_cache (); /* The last thing we do is free the objfile struct itself. */ objfile_free_data (objfile); if (objfile->name != NULL) { xmfree (objfile->md, objfile->name); } if (objfile->global_psymbols.list) xmfree (objfile->md, objfile->global_psymbols.list); if (objfile->static_psymbols.list) xmfree (objfile->md, objfile->static_psymbols.list); /* Free the obstacks for non-reusable objfiles */ bcache_xfree (objfile->psymbol_cache); bcache_xfree (objfile->macro_cache); if (objfile->demangled_names_hash) htab_delete (objfile->demangled_names_hash); obstack_free (&objfile->objfile_obstack, 0); xmfree (objfile->md, objfile); objfile = NULL; }