X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fexec.c;h=511977f57031deedf2fa448fd760ce68cf05a005;hb=3a42e9d0622736d6ad84c37a2d4f4f54a0c30469;hp=76d492866474664bc7b37e44164f694ad8a0bee0;hpb=507f3c78fb4a1235b731350d60f1bf0ce94b4175;p=binutils-gdb.git diff --git a/gdb/exec.c b/gdb/exec.c index 76d49286647..511977f5703 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -1,5 +1,6 @@ /* Work with executable files, for GDB. - Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1997, 1998 + Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, + 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GDB. @@ -27,6 +28,7 @@ #include "language.h" #include "symfile.h" #include "objfiles.h" +#include "completer.h" #ifdef USG #include @@ -93,10 +95,16 @@ CORE_ADDR text_end = 0; struct vmap *vmap; +void +exec_open (char *args, int from_tty) +{ + target_preopen (from_tty); + exec_file_attach (args, from_tty); +} + /* ARGSUSED */ static void -exec_close (quitting) - int quitting; +exec_close (int quitting) { int need_symtab_cleanup = 0; struct vmap *vp, *nxt; @@ -126,7 +134,7 @@ exec_close (quitting) FIXME-as-well: free_objfile already free'd vp->name, so it isn't valid here. */ free_named_symtabs (vp->name); - free (vp); + xfree (vp); } vmap = NULL; @@ -138,18 +146,28 @@ exec_close (quitting) if (!bfd_close (exec_bfd)) warning ("cannot close \"%s\": %s", name, bfd_errmsg (bfd_get_error ())); - free (name); + xfree (name); exec_bfd = NULL; } if (exec_ops.to_sections) { - free ((PTR) exec_ops.to_sections); + xfree (exec_ops.to_sections); exec_ops.to_sections = NULL; exec_ops.to_sections_end = NULL; } } +void +exec_file_clear (int from_tty) +{ + /* Remove exec file. */ + unpush_target (&exec_ops); + + if (from_tty) + printf_unfiltered ("No executable file now.\n"); +} + /* Process the first arg in ARGS as the new exec file. This function is intended to be behave essentially the same @@ -165,48 +183,32 @@ exec_close (quitting) given a pid but not a exec pathname, and the attach command could figure out the pathname from the pid. (In this case, we shouldn't ask the user whether the current target should be shut down -- - we're supplying the exec pathname late for good reason.) */ + we're supplying the exec pathname late for good reason.) + + ARGS is assumed to be the filename. */ void -exec_file_attach (args, from_tty) - char *args; - int from_tty; +exec_file_attach (char *filename, int from_tty) { - char **argv; - char *filename; - /* Remove any previous exec file. */ unpush_target (&exec_ops); /* Now open and digest the file the user requested, if any. */ - if (args) + if (!filename) + { + if (from_tty) + printf_unfiltered ("No executable file now.\n"); + } + else { char *scratch_pathname; int scratch_chan; - /* Scan through the args and pick up the first non option arg - as the filename. */ - - argv = buildargv (args); - if (argv == NULL) - nomem (0); - - make_cleanup_freeargv (argv); - - for (; (*argv != NULL) && (**argv == '-'); argv++) - {; - } - if (*argv == NULL) - error ("No executable file name was specified"); - - filename = tilde_expand (*argv); - make_cleanup (free, filename); - scratch_chan = openp (getenv ("PATH"), 1, filename, write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, &scratch_pathname); -#if defined(__GO32__) || defined(_WIN32) +#if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__) if (scratch_chan < 0) { char *exename = alloca (strlen (filename) + 5); @@ -228,7 +230,7 @@ exec_file_attach (args, from_tty) via the exec_bfd->name pointer, so we need to make another copy and leave exec_bfd as the new owner of the original copy. */ scratch_pathname = xstrdup (scratch_pathname); - make_cleanup (free, scratch_pathname); + make_cleanup (xfree, scratch_pathname); if (!bfd_check_format (exec_bfd, bfd_object)) { @@ -300,23 +302,47 @@ exec_file_attach (args, from_tty) if (exec_file_display_hook) (*exec_file_display_hook) (filename); } - else if (from_tty) - printf_unfiltered ("No executable file now.\n"); } /* Process the first arg in ARGS as the new exec file. Note that we have to explicitly ignore additional args, since we can be called from file_command(), which also calls symbol_file_command() - which can take multiple args. */ + which can take multiple args. + + If ARGS is NULL, we just want to close the exec file. */ -void -exec_file_command (args, from_tty) - char *args; - int from_tty; +static void +exec_file_command (char *args, int from_tty) { + char **argv; + char *filename; + target_preopen (from_tty); - exec_file_attach (args, from_tty); + + if (args) + { + /* Scan through the args and pick up the first non option arg + as the filename. */ + + argv = buildargv (args); + if (argv == NULL) + nomem (0); + + make_cleanup_freeargv (argv); + + for (; (*argv != NULL) && (**argv == '-'); argv++) + {; + } + if (*argv == NULL) + error ("No executable file name was specified"); + + filename = tilde_expand (*argv); + make_cleanup (xfree, filename); + exec_file_attach (filename, from_tty); + } + else + exec_file_attach (NULL, from_tty); } /* Set both the exec file and the symbol file, in one command. @@ -324,9 +350,7 @@ exec_file_command (args, from_tty) command was added? */ static void -file_command (arg, from_tty) - char *arg; - int from_tty; +file_command (char *arg, int from_tty) { /* FIXME, if we lose on reading the symbol file, we should revert the exec file, but that's rough. */ @@ -342,10 +366,7 @@ file_command (arg, from_tty) we cast it back to its proper type. */ static void -add_to_section_table (abfd, asect, table_pp_char) - bfd *abfd; - sec_ptr asect; - PTR table_pp_char; +add_to_section_table (bfd *abfd, sec_ptr asect, PTR table_pp_char) { struct section_table **table_pp = (struct section_table **) table_pp_char; flagword aflag; @@ -366,29 +387,25 @@ add_to_section_table (abfd, asect, table_pp_char) Returns 0 if OK, 1 on error. */ int -build_section_table (some_bfd, start, end) - bfd *some_bfd; - struct section_table **start, **end; +build_section_table (bfd *some_bfd, struct section_table **start, + struct section_table **end) { unsigned count; count = bfd_count_sections (some_bfd); if (*start) - free ((PTR) * start); + xfree (* start); *start = (struct section_table *) xmalloc (count * sizeof (**start)); *end = *start; bfd_map_over_sections (some_bfd, add_to_section_table, (char *) end); if (*end > *start + count) - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); /* We could realloc the table, but it probably loses for most files. */ return 0; } static void -bfdsec_to_vmap (abfd, sect, arg3) - bfd *abfd; - sec_ptr sect; - PTR arg3; +bfdsec_to_vmap (bfd *abfd, sec_ptr sect, PTR arg3) { struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3; struct vmap *vp; @@ -418,9 +435,7 @@ bfdsec_to_vmap (abfd, sect, arg3) Return the new vmap. */ struct vmap * -map_vmap (abfd, arch) - bfd *abfd; - bfd *arch; +map_vmap (bfd *abfd, bfd *arch) { struct vmap_and_bfd vmap_bfd; struct vmap *vp, **vpp; @@ -463,21 +478,18 @@ map_vmap (abfd, arch) we just tail-call it with more arguments to select between them. */ int -xfer_memory (memaddr, myaddr, len, write, target) - CORE_ADDR memaddr; - char *myaddr; - int len; - int write; - struct target_ops *target; +xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, + struct mem_attrib *attrib, + struct target_ops *target) { boolean res; struct section_table *p; CORE_ADDR nextsectaddr, memend; boolean (*xfer_fn) (bfd *, sec_ptr, PTR, file_ptr, bfd_size_type); - asection *section; + asection *section = NULL; if (len <= 0) - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); if (overlay_debugging) { @@ -528,9 +540,7 @@ xfer_memory (memaddr, myaddr, len, write, target) void -print_section_info (t, abfd) - struct target_ops *t; - bfd *abfd; +print_section_info (struct target_ops *t, bfd *abfd) { struct section_table *p; @@ -561,8 +571,7 @@ print_section_info (t, abfd) } static void -exec_files_info (t) - struct target_ops *t; +exec_files_info (struct target_ops *t) { print_section_info (t, exec_bfd); @@ -596,10 +605,8 @@ exec_files_info (t) in the exec objfile. */ void -exec_set_section_offsets (text_off, data_off, bss_off) - bfd_signed_vma text_off; - bfd_signed_vma data_off; - bfd_signed_vma bss_off; +exec_set_section_offsets (bfd_signed_vma text_off, bfd_signed_vma data_off, + bfd_signed_vma bss_off) { struct section_table *sect; @@ -630,9 +637,7 @@ exec_set_section_offsets (text_off, data_off, bss_off) } static void -set_section_command (args, from_tty) - char *args; - int from_tty; +set_section_command (char *args, int from_tty) { struct section_table *p; char *secname; @@ -676,9 +681,7 @@ set_section_command (args, from_tty) breakpoint_init_inferior). */ static int -ignore (addr, contents) - CORE_ADDR addr; - char *contents; +ignore (CORE_ADDR addr, char *contents) { return 0; } @@ -687,13 +690,13 @@ ignore (addr, contents) defined. */ void -init_exec_ops () +init_exec_ops (void) { exec_ops.to_shortname = "exec"; exec_ops.to_longname = "Local exec file"; exec_ops.to_doc = "Use an executable file as a target.\n\ Specify the filename of the executable file."; - exec_ops.to_open = exec_file_command; + exec_ops.to_open = exec_open; exec_ops.to_close = exec_close; exec_ops.to_attach = find_default_attach; exec_ops.to_require_attach = find_default_require_attach; @@ -710,7 +713,7 @@ Specify the filename of the executable file."; } void -_initialize_exec () +_initialize_exec (void) { struct cmd_list_element *c;