daily update
[deliverable/binutils-gdb.git] / gdb / exec.c
index edb730802d649d778c3f2fd7e30cd99c4e71b11b..e0652fbaec15a5bf10f77767dccc5beff5296804 100644 (file)
@@ -1,7 +1,8 @@
 /* Work with executable files, for GDB. 
-   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+
+   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+   1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
+   Inc.
 
    This file is part of GDB.
 
 #include "objfiles.h"
 #include "completer.h"
 #include "value.h"
+#include "exec.h"
 
 #ifdef USG
 #include <sys/types.h>
 #endif
 
 #include <fcntl.h>
+#include "readline/readline.h"
 #include "gdb_string.h"
 
 #include "gdbcore.h"
 
 struct vmap *map_vmap (bfd *, bfd *);
 
-void (*file_changed_hook) (char *);
+void (*deprecated_file_changed_hook) (char *);
 
 /* Prototypes for local functions */
 
-static void add_to_section_table (bfd *, sec_ptr, PTR);
-
 static void exec_close (int);
 
 static void file_command (char *, int);
@@ -64,8 +65,6 @@ static void set_section_command (char *, int);
 
 static void exec_files_info (struct target_ops *);
 
-static void bfdsec_to_vmap (bfd *, sec_ptr, PTR);
-
 static int ignore (CORE_ADDR, char *);
 
 static void init_exec_ops (void);
@@ -84,14 +83,6 @@ bfd *exec_bfd = NULL;
 
 int write_files = 0;
 
-/* Text start and end addresses (KLUDGE) if needed */
-
-#ifndef NEED_TEXT_START_END
-#define NEED_TEXT_START_END (0)
-#endif
-CORE_ADDR text_start = 0;
-CORE_ADDR text_end = 0;
-
 struct vmap *vmap;
 
 void
@@ -101,7 +92,6 @@ exec_open (char *args, int from_tty)
   exec_file_attach (args, from_tty);
 }
 
-/* ARGSUSED */
 static void
 exec_close (int quitting)
 {
@@ -204,7 +194,7 @@ exec_file_attach (char *filename, int from_tty)
       char *scratch_pathname;
       int scratch_chan;
 
-      scratch_chan = openp (getenv ("PATH"), 1, filename,
+      scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, filename,
                   write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0,
                            &scratch_pathname);
 #if defined(__GO32__) || defined(_WIN32) || defined(__CYGWIN__)
@@ -212,8 +202,9 @@ exec_file_attach (char *filename, int from_tty)
        {
          char *exename = alloca (strlen (filename) + 5);
          strcat (strcpy (exename, filename), ".exe");
-         scratch_chan = openp (getenv ("PATH"), 1, exename, write_files ?
-            O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0, &scratch_pathname);
+         scratch_chan = openp (getenv ("PATH"), OPF_TRY_CWD_FIRST, exename,
+            write_files ? O_RDWR | O_BINARY : O_RDONLY | O_BINARY, 0,
+            &scratch_pathname);
        }
 #endif
       if (scratch_chan < 0)
@@ -242,7 +233,7 @@ exec_file_attach (char *filename, int from_tty)
 
       /* FIXME - This should only be run for RS6000, but the ifdef is a poor
          way to accomplish.  */
-#ifdef IBM6000_TARGET
+#ifdef DEPRECATED_IBM6000_TARGET
       /* Setup initial vmap. */
 
       map_vmap (exec_bfd, 0);
@@ -254,7 +245,7 @@ exec_file_attach (char *filename, int from_tty)
          error ("\"%s\": can't find the file sections: %s",
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
        }
-#endif /* IBM6000_TARGET */
+#endif /* DEPRECATED_IBM6000_TARGET */
 
       if (build_section_table (exec_bfd, &exec_ops.to_sections,
                               &exec_ops.to_sections_end))
@@ -266,30 +257,9 @@ exec_file_attach (char *filename, int from_tty)
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
        }
 
-      /* text_end is sometimes used for where to put call dummies.  A
-         few ports use these for other purposes too.  */
-      if (NEED_TEXT_START_END)
-       {
-         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.  */
-         /* FIXME: The comment above does not match the code.  The
-            code checks for sections with are either code *or*
-            readonly.  */
-         text_start = ~(CORE_ADDR) 0;
-         text_end = (CORE_ADDR) 0;
-         for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
-           if (bfd_get_section_flags (p->bfd, p->the_bfd_section)
-               & (SEC_CODE | SEC_READONLY))
-             {
-               if (text_start > p->addr)
-                 text_start = p->addr;
-               if (text_end < p->endaddr)
-                 text_end = p->endaddr;
-             }
-       }
+#ifdef DEPRECATED_HPUX_TEXT_END
+      DEPRECATED_HPUX_TEXT_END (&exec_ops);
+#endif
 
       validate_files ();
 
@@ -298,9 +268,10 @@ exec_file_attach (char *filename, int from_tty)
       push_target (&exec_ops);
 
       /* Tell display code (if any) about the changed file name.  */
-      if (exec_file_display_hook)
-       (*exec_file_display_hook) (filename);
+      if (deprecated_exec_file_display_hook)
+       (*deprecated_exec_file_display_hook) (filename);
     }
+  bfd_cache_close_all ();
 }
 
 /*  Process the first arg in ARGS as the new exec file.
@@ -355,8 +326,8 @@ file_command (char *arg, int from_tty)
      the exec file, but that's rough.  */
   exec_file_command (arg, from_tty);
   symbol_file_command (arg, from_tty);
-  if (file_changed_hook)
-    file_changed_hook (arg);
+  if (deprecated_file_changed_hook)
+    deprecated_file_changed_hook (arg);
 }
 \f
 
@@ -365,7 +336,8 @@ file_command (char *arg, int from_tty)
    we cast it back to its proper type.  */
 
 static void
-add_to_section_table (bfd *abfd, sec_ptr asect, PTR table_pp_char)
+add_to_section_table (bfd *abfd, struct bfd_section *asect,
+                     void *table_pp_char)
 {
   struct section_table **table_pp = (struct section_table **) table_pp_char;
   flagword aflag;
@@ -386,7 +358,7 @@ add_to_section_table (bfd *abfd, sec_ptr asect, PTR table_pp_char)
    Returns 0 if OK, 1 on error.  */
 
 int
-build_section_table (bfd *some_bfd, struct section_table **start,
+build_section_table (struct bfd *some_bfd, struct section_table **start,
                     struct section_table **end)
 {
   unsigned count;
@@ -404,7 +376,7 @@ build_section_table (bfd *some_bfd, struct section_table **start,
 }
 \f
 static void
-bfdsec_to_vmap (bfd *abfd, sec_ptr sect, PTR arg3)
+bfdsec_to_vmap (struct bfd *abfd, struct bfd_section *sect, void *arg3)
 {
   struct vmap_and_bfd *vmap_bfd = (struct vmap_and_bfd *) arg3;
   struct vmap *vp;
@@ -414,14 +386,14 @@ bfdsec_to_vmap (bfd *abfd, sec_ptr sect, PTR arg3)
   if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
     return;
 
-  if (STREQ (bfd_section_name (abfd, sect), ".text"))
+  if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".text"))
     {
       vp->tstart = bfd_section_vma (abfd, sect);
       vp->tend = vp->tstart + bfd_section_size (abfd, sect);
       vp->tvma = bfd_section_vma (abfd, sect);
       vp->toffs = sect->filepos;
     }
-  else if (STREQ (bfd_section_name (abfd, sect), ".data"))
+  else if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".data"))
     {
       vp->dstart = bfd_section_vma (abfd, sect);
       vp->dend = vp->dstart + bfd_section_size (abfd, sect);
@@ -484,7 +456,6 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
   int res;
   struct section_table *p;
   CORE_ADDR nextsectaddr, memend;
-  int (*xfer_fn) (bfd *, sec_ptr, PTR, file_ptr, bfd_size_type);
   asection *section = NULL;
 
   if (len <= 0)
@@ -498,7 +469,6 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
     }
 
   memend = memaddr + len;
-  xfer_fn = write ? bfd_set_section_contents : bfd_get_section_contents;
   nextsectaddr = memend;
 
   for (p = target->to_sections; p < target->to_sections_end; p++)
@@ -511,8 +481,14 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
          if (memend <= p->endaddr)
            {
              /* Entire transfer is within this section.  */
-             res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
-                            memaddr - p->addr, len);
+             if (write)
+               res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
+                                               myaddr, memaddr - p->addr,
+                                               len);
+             else
+               res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
+                                               myaddr, memaddr - p->addr,
+                                               len);
              return (res != 0) ? len : 0;
            }
          else if (memaddr >= p->endaddr)
@@ -524,8 +500,14 @@ xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
            {
              /* This section overlaps the transfer.  Just do half.  */
              len = p->endaddr - memaddr;
-             res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
-                            memaddr - p->addr, len);
+             if (write)
+               res = bfd_set_section_contents (p->bfd, p->the_bfd_section,
+                                               myaddr, memaddr - p->addr,
+                                               len);
+             else
+               res = bfd_get_section_contents (p->bfd, p->the_bfd_section,
+                                               myaddr, memaddr - p->addr,
+                                               len);
              return (res != 0) ? len : 0;
            }
         }
@@ -544,6 +526,8 @@ void
 print_section_info (struct target_ops *t, bfd *abfd)
 {
   struct section_table *p;
+  /* FIXME: "016l" is not wide enough when TARGET_ADDR_BIT > 64.  */
+  char *fmt = TARGET_ADDR_BIT <= 32 ? "08l" : "016l";
 
   printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
   wrap_here ("        ");
@@ -556,12 +540,17 @@ print_section_info (struct target_ops *t, bfd *abfd)
     }
   for (p = t->to_sections; p < t->to_sections_end; p++)
     {
-      /* FIXME-32x64 need a print_address_numeric with field width */
-      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"));
+      printf_filtered ("\t%s", local_hex_string_custom (p->addr, fmt));
+      printf_filtered (" - %s", local_hex_string_custom (p->endaddr, fmt));
+
+      /* FIXME: A format of "08l" is not wide enough for file offsets
+        larger than 4GB.  OTOH, making it "016l" isn't desirable either
+        since most output will then be much wider than necessary.  It
+        may make sense to test the size of the file and choose the
+        format string accordingly.  */
       if (info_verbose)
        printf_filtered (" @ %s",
-                        local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l"));
+                        local_hex_string_custom (p->the_bfd_section->filepos, "08l"));
       printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
       if (p->bfd != abfd)
        {
@@ -714,8 +703,6 @@ Specify the filename of the executable file.";
   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;
-  exec_ops.to_require_detach = find_default_require_detach;
   exec_ops.to_xfer_memory = xfer_memory;
   exec_ops.to_files_info = exec_files_info;
   exec_ops.to_insert_breakpoint = ignore;
@@ -760,7 +747,7 @@ This can be used if the exec file does not contain section addresses,\n\
 file itself are wrong.  Each section must be changed separately.  The\n\
 ``info files'' command lists all the sections and their addresses.");
 
-  add_show_from_set
+  deprecated_add_show_from_set
     (add_set_cmd ("write", class_support, var_boolean, (char *) &write_files,
                  "Set writing into executable and core files.",
                  &setlist),
This page took 0.028939 seconds and 4 git commands to generate.