* gdb.texinfo (Continuing and Stepping): When talking about "step"
[deliverable/binutils-gdb.git] / gdb / exec.c
index 79b07e499e5d8d463b58717a2bfd26e2621dca08..356f07b438717da87f29aedf5074a3ae1bf0653a 100644 (file)
@@ -22,6 +22,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "inferior.h"
 #include "target.h"
 #include "gdbcmd.h"
+#include "language.h"
 
 #ifdef USG
 #include <sys/types.h>
@@ -83,7 +84,9 @@ exec_close (quitting)
      int quitting;
 {
   if (exec_bfd) {
+    char *name = bfd_get_filename (exec_bfd);
     bfd_close (exec_bfd);
+    free (name);
     exec_bfd = NULL;
   }
   if (exec_ops.to_sections) {
@@ -143,30 +146,51 @@ exec_file_command (args, from_tty)
       if (scratch_chan < 0)
        perror_with_name (filename);
 
-      exec_bfd = bfd_fdopenr (scratch_pathname, NULL, scratch_chan);
+      exec_bfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
       if (!exec_bfd)
        error ("Could not open `%s' as an executable file: %s",
               scratch_pathname, bfd_errmsg (bfd_error));
       if (!bfd_check_format (exec_bfd, bfd_object))
-       error ("\"%s\": not in executable format: %s.",
-              scratch_pathname, bfd_errmsg (bfd_error));
+       {
+         /* Make sure to close exec_bfd, or else "run" might try to use
+            it.  */
+         exec_close (0);
+         error ("\"%s\": not in executable format: %s.",
+                scratch_pathname, bfd_errmsg (bfd_error));
+       }
 
       if (build_section_table (exec_bfd, &exec_ops.to_sections,
                                &exec_ops.to_sections_end))
-       error ("Can't find the file sections in `%s': %s", 
-               exec_bfd->filename, bfd_errmsg (bfd_error));
+       {
+         /* Make sure to close exec_bfd, or else "run" might try to use
+            it.  */
+         exec_close (0);
+         error ("Can't find the file sections in `%s': %s", 
+                exec_bfd->filename, bfd_errmsg (bfd_error));
+       }
 
 #ifdef NEED_TEXT_START_END
-      /* This is a KLUDGE (FIXME) because a few places in a few ports
-        (29K springs to mind) need this info for now.  */
+
+      /* text_end is sometimes used for where to put call dummies.  A
+        few ports use these for other purposes too.  */
+
       {
        struct section_table *p;
+
+       /* Set text_start to the lowest address of the start of any
+          readonly code section and set text_end to the highest
+          address of the end of any readonly code section.  */
+
+       text_start = ~(CORE_ADDR)0;
+       text_end = (CORE_ADDR)0;
        for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
-         if (!strcmp (".text", bfd_section_name (p->bfd, p->sec_ptr)))
+         if (bfd_get_section_flags (p->bfd, p->sec_ptr)
+             & (SEC_CODE | SEC_READONLY))
            {
-             text_start = p->addr;
-             text_end   = p->endaddr;
-             break;
+             if (text_start > p->addr) 
+               text_start = p->addr;
+             if (text_end < p->endaddr)
+               text_end = p->endaddr;
            }
       }
 #endif
@@ -180,7 +204,7 @@ exec_file_command (args, from_tty)
        (*exec_file_display_hook) (filename);
     }
   else if (from_tty)
-    printf_filtered ("No exec file now.\n");
+    printf_unfiltered ("No exec file now.\n");
 }
 
 /* Set both the exec file and the symbol file, in one command.  
@@ -329,7 +353,7 @@ xfer_memory (memaddr, myaddr, len, write, target)
        wanna_xfer = coredata;
       }
 #endif                         /* REG_STACK_SEGMENT */
-#endif FIXME
+#endif /* FIXME */
 \f
 void
 print_section_info (t, abfd)
@@ -341,13 +365,14 @@ print_section_info (t, abfd)
   printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
   wrap_here ("        ");
   printf_filtered ("file type %s.\n", bfd_get_target(abfd));
-
+  printf_filtered ("\tEntry point: %s\n",
+                  local_hex_string ((unsigned long) bfd_get_start_address (exec_bfd)));
   for (p = t->to_sections; p < t->to_sections_end; p++) {
-    printf_filtered ("\t%s", local_hex_string_custom (p->addr, "08"));
-    printf_filtered (" - %s", local_hex_string_custom (p->endaddr, "08"));
+    printf_filtered ("\t%s", local_hex_string_custom ((unsigned long) p->addr, "08l"));
+    printf_filtered (" - %s", local_hex_string_custom ((unsigned long) p->endaddr, "08l"));
     if (info_verbose)
       printf_filtered (" @ %s",
-                      local_hex_string_custom (p->sec_ptr->filepos, "08"));
+                      local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
     printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
     if (p->bfd != abfd) {
       printf_filtered (" in %s", bfd_get_filename (p->bfd));
@@ -403,21 +428,34 @@ set_section_command (args, from_tty)
   error ("Section %s not found", secprint);
 }
 
+/* If mourn is being called in all the right places, this could be say
+   `gdb internal error' (since generic_mourn calls breakpoint_init_inferior).  */
+
+static int
+ignore (addr, contents)
+     CORE_ADDR addr;
+     char *contents;
+{
+  return 0;
+}
+
 struct target_ops exec_ops = {
        "exec", "Local exec file",
        "Use an executable file as a target.\n\
 Specify the filename of the executable file.",
        exec_file_command, exec_close, /* open, close */
-       child_attach, 0, 0, 0, /* attach, detach, resume, wait, */
+       find_default_attach, 0, 0, 0, /* attach, detach, resume, wait, */
        0, 0, /* fetch_registers, store_registers, */
-       0, 0, 0, /* prepare_to_store, conv_to, conv_from, */
+       0, /* prepare_to_store, */
        xfer_memory, exec_files_info,
-       0, 0, /* insert_breakpoint, remove_breakpoint, */
+       ignore, ignore, /* insert_breakpoint, remove_breakpoint, */
        0, 0, 0, 0, 0, /* terminal stuff */
        0, 0, /* kill, load */
        0, /* lookup sym */
-       child_create_inferior,
+       find_default_create_inferior,
        0, /* mourn_inferior */
+       0, /* can_run */
+       0, /* notice_signals */
        file_stratum, 0, /* next */
        0, 1, 0, 0, 0,  /* all mem, mem, stack, regs, exec */
        0, 0,                   /* section pointers */
@@ -427,20 +465,23 @@ Specify the filename of the executable file.",
 void
 _initialize_exec()
 {
+  struct cmd_list_element *c;
 
-  add_com ("file", class_files, file_command,
-          "Use FILE as program to be debugged.\n\
+  c = add_cmd ("file", class_files, file_command,
+              "Use FILE as program to be debugged.\n\
 It is read for its symbols, for getting the contents of pure memory,\n\
 and it is the program executed when you use the `run' command.\n\
 If FILE cannot be found as specified, your execution directory path\n\
 ($PATH) is searched for a command of that name.\n\
-No arg means to have no executable file and no symbols.");
+No arg means to have no executable file and no symbols.", &cmdlist);
+  c->completer = filename_completer;
 
-  add_com ("exec-file", class_files, exec_file_command,
+  c = add_cmd ("exec-file", class_files, exec_file_command,
           "Use FILE as program for getting contents of pure memory.\n\
 If FILE cannot be found as specified, your execution directory path\n\
 is searched for a command of that name.\n\
-No arg means have no executable file.");
+No arg means have no executable file.", &cmdlist);
+  c->completer = filename_completer;
 
   add_com ("section", class_files, set_section_command,
    "Change the base address of section SECTION of the exec file to ADDR.\n\
This page took 0.025284 seconds and 4 git commands to generate.