X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fexec.c;h=4358aca52a1718d564a513bfa9b4e160fa3e89d9;hb=4ee62156d969867d3d3ffedf656a74643f77279e;hp=e1d429073d1aaa05ef8a4cdd3ebed31f3296c533;hpb=4b477ade4f01d4510ac44f4251b511b11d593318;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/exec.c b/gdb/exec.c index e1d429073d..4358aca52a 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -32,6 +32,8 @@ #include "exec.h" #include "observer.h" #include "arch-utils.h" +#include "gdbthread.h" +#include "progspace.h" #include #include "readline/readline.h" @@ -50,8 +52,6 @@ void (*deprecated_file_changed_hook) (char *); /* Prototypes for local functions */ -static void exec_close (int); - static void file_command (char *, int); static void set_section_command (char *, int); @@ -66,20 +66,8 @@ void _initialize_exec (void); struct target_ops exec_ops; -/* The Binary File Descriptor handle for the executable file. */ - -bfd *exec_bfd = NULL; -long exec_bfd_mtime = 0; - -/* GDB currently only supports a single symbol/address space for the - whole debug session. When that limitation is lifted, this global - goes away. */ -static struct target_section_table current_target_sections_1; - -/* The set of target sections matching the sections mapped into the - current inferior's address space. */ -static struct target_section_table *current_target_sections - = ¤t_target_sections_1; +/* True if the exec target is pushed on the stack. */ +static int using_exec_ops; /* Whether to open exec and core files read-only or read-write. */ @@ -105,8 +93,8 @@ exec_open (char *args, int from_tty) /* Close and clear exec_bfd. If we end up with no target sections to read memory from, this unpushes the exec_ops target. */ -static void -exec_close_1 (void) +void +exec_close (void) { if (exec_bfd) { @@ -127,12 +115,17 @@ exec_close_1 (void) } } +/* This is the target_close implementation. Clears all target + sections and closes all executable bfds from all program spaces. */ + static void -exec_close (int quitting) +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; @@ -163,20 +156,32 @@ exec_close (int quitting) vmap = NULL; - /* Delete all target sections. */ - resize_section_table - (current_target_sections, - -resize_section_table (current_target_sections, 0)); + { + struct program_space *ss; + struct cleanup *old_chain; - /* Remove exec file. */ - exec_close_1 (); + 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); + } } void exec_file_clear (int from_tty) { /* Remove exec file. */ - exec_close_1 (); + exec_close (); if (from_tty) printf_unfiltered (_("No executable file now.\n")); @@ -203,7 +208,7 @@ void exec_file_attach (char *filename, int from_tty) { /* Remove any previous exec file. */ - exec_close_1 (); + exec_close (); /* Now open and digest the file the user requested, if any. */ @@ -258,7 +263,7 @@ exec_file_attach (char *filename, int from_tty) { /* Make sure to close exec_bfd, or else "run" might try to use it. */ - exec_close_1 (); + exec_close (); error (_("\"%s\": not in executable format: %s"), scratch_pathname, bfd_errmsg (bfd_get_error ())); } @@ -273,7 +278,7 @@ exec_file_attach (char *filename, int from_tty) { /* Make sure to close exec_bfd, or else "run" might try to use it. */ - exec_close_1 (); + exec_close (); error (_("\"%s\": can't find the file sections: %s"), scratch_pathname, bfd_errmsg (bfd_get_error ())); } @@ -283,7 +288,7 @@ exec_file_attach (char *filename, int from_tty) { /* Make sure to close exec_bfd, or else "run" might try to use it. */ - exec_close_1 (); + exec_close (); error (_("\"%s\": can't find the file sections: %s"), scratch_pathname, bfd_errmsg (bfd_get_error ())); } @@ -295,7 +300,8 @@ exec_file_attach (char *filename, int from_tty) set_gdbarch_from_file (exec_bfd); /* Add the executable's sections to the current address spaces' - list of sections. */ + list of sections. This possibly pushes the exec_ops + target. */ add_target_sections (sections, sections_end); xfree (sections); @@ -465,8 +471,11 @@ add_target_sections (struct target_section *sections, /* If these are the first file sections we can provide memory from, push the file_stratum target. */ - if (space == 0) - push_target (&exec_ops); + if (!using_exec_ops) + { + using_exec_ops = 1; + push_target (&exec_ops); + } } } @@ -499,7 +508,16 @@ remove_target_sections (bfd *abfd) /* If we don't have any more sections to read memory from, remove the file_stratum target from the stack. */ if (old_count + (dest - src) == 0) - unpush_target (&exec_ops); + { + struct program_space *pspace; + + ALL_PSPACES (pspace) + if (pspace->target_sections.sections + != pspace->target_sections.sections_end) + return; + + unpush_target (&exec_ops); + } } } @@ -647,16 +665,17 @@ exec_xfer_partial (struct target_ops *ops, enum target_object object, void print_section_info (struct target_section_table *t, bfd *abfd) { + struct gdbarch *gdbarch = gdbarch_from_bfd (abfd); struct target_section *p; /* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64. */ - int wid = gdbarch_addr_bit (gdbarch_from_bfd (abfd)) <= 32 ? 8 : 16; + int wid = gdbarch_addr_bit (gdbarch) <= 32 ? 8 : 16; printf_filtered ("\t`%s', ", bfd_get_filename (abfd)); wrap_here (" "); printf_filtered (_("file type %s.\n"), bfd_get_target (abfd)); if (abfd == exec_bfd) printf_filtered (_("\tEntry point: %s\n"), - paddress (bfd_get_start_address (abfd))); + paddress (gdbarch, bfd_get_start_address (abfd))); for (p = t->sections; p < t->sections_end; p++) { printf_filtered ("\t%s", hex_string_custom (p->addr, wid)); @@ -685,23 +704,24 @@ exec_files_info (struct target_ops *t) if (vmap) { + int addr_size = gdbarch_addr_bit (target_gdbarch) / 8; struct vmap *vp; printf_unfiltered (_("\tMapping info for file `%s'.\n"), vmap->name); printf_unfiltered ("\t %*s %*s %*s %*s %8.8s %s\n", - strlen_paddr (), "tstart", - strlen_paddr (), "tend", - strlen_paddr (), "dstart", - strlen_paddr (), "dend", + addr_size * 2, "tstart", + addr_size * 2, "tend", + addr_size * 2, "dstart", + addr_size * 2, "dend", "section", "file(member)"); for (vp = vmap; vp; vp = vp->nxt) printf_unfiltered ("\t0x%s 0x%s 0x%s 0x%s %s%s%s%s\n", - paddr (vp->tstart), - paddr (vp->tend), - paddr (vp->dstart), - paddr (vp->dend), + phex (vp->tstart, addr_size), + phex (vp->tend, addr_size), + phex (vp->dstart, addr_size), + phex (vp->dend, addr_size), vp->name, *vp->member ? "(" : "", vp->member, *vp->member ? ")" : ""); @@ -776,7 +796,7 @@ exec_set_section_address (const char *filename, int index, CORE_ADDR address) breakpoint_init_inferior). */ static int -ignore (struct bp_target_info *bp_tgt) +ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt) { return 0; } @@ -815,7 +835,7 @@ init_exec_ops (void) exec_ops.to_doc = "Use an executable file as a target.\n\ Specify the filename of the executable file."; exec_ops.to_open = exec_open; - exec_ops.to_close = exec_close; + exec_ops.to_close = exec_close_1; exec_ops.to_attach = find_default_attach; exec_ops.to_xfer_partial = exec_xfer_partial; exec_ops.to_get_section_table = exec_get_section_table;