* alpha-tdep.c (alpha_register_type): Use builtin_type (gdbarch)
[deliverable/binutils-gdb.git] / gdb / exec.c
index c9466133798dd6781c178be44f8c2668a7a36c17..94e0a0d3500d936e320d99ff6e75b358a27f5a63 100644 (file)
@@ -1,14 +1,14 @@
 /* Work with executable files, for GDB. 
 
 /* Work with executable files, for GDB. 
 
-   Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
-   Inc.
+   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+   1998, 1999, 2000, 2001, 2002, 2003, 2007, 2008
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +17,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "frame.h"
 
 #include "defs.h"
 #include "frame.h"
@@ -33,6 +31,7 @@
 #include "value.h"
 #include "exec.h"
 #include "observer.h"
 #include "value.h"
 #include "exec.h"
 #include "observer.h"
+#include "arch-utils.h"
 
 #include <fcntl.h>
 #include "readline/readline.h"
 
 #include <fcntl.h>
 #include "readline/readline.h"
@@ -42,9 +41,6 @@
 
 #include <ctype.h>
 #include "gdb_stat.h"
 
 #include <ctype.h>
 #include "gdb_stat.h"
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
 
 #include "xcoffsolib.h"
 
 
 #include "xcoffsolib.h"
 
@@ -62,8 +58,6 @@ static void set_section_command (char *, int);
 
 static void exec_files_info (struct target_ops *);
 
 
 static void exec_files_info (struct target_ops *);
 
-static int ignore (CORE_ADDR, bfd_byte *);
-
 static void init_exec_ops (void);
 
 void _initialize_exec (void);
 static void init_exec_ops (void);
 
 void _initialize_exec (void);
@@ -75,6 +69,7 @@ struct target_ops exec_ops;
 /* The Binary File Descriptor handle for the executable file.  */
 
 bfd *exec_bfd = NULL;
 /* The Binary File Descriptor handle for the executable file.  */
 
 bfd *exec_bfd = NULL;
+long exec_bfd_mtime = 0;
 
 /* Whether to open exec and core files read-only or read-write.  */
 
 
 /* Whether to open exec and core files read-only or read-write.  */
 
@@ -90,7 +85,7 @@ show_write_files (struct ui_file *file, int from_tty,
 
 struct vmap *vmap;
 
 
 struct vmap *vmap;
 
-void
+static void
 exec_open (char *args, int from_tty)
 {
   target_preopen (from_tty);
 exec_open (char *args, int from_tty)
 {
   target_preopen (from_tty);
@@ -142,6 +137,7 @@ exec_close (int quitting)
                 name, bfd_errmsg (bfd_get_error ()));
       xfree (name);
       exec_bfd = NULL;
                 name, bfd_errmsg (bfd_get_error ()));
       xfree (name);
       exec_bfd = NULL;
+      exec_bfd_mtime = 0;
     }
 
   if (exec_ops.to_sections)
     }
 
   if (exec_ops.to_sections)
@@ -193,6 +189,8 @@ exec_file_attach (char *filename, int from_tty)
     {
       if (from_tty)
         printf_unfiltered (_("No executable file now.\n"));
     {
       if (from_tty)
         printf_unfiltered (_("No executable file now.\n"));
+
+      set_gdbarch_from_file (NULL);
     }
   else
     {
     }
   else
     {
@@ -264,6 +262,8 @@ exec_file_attach (char *filename, int from_tty)
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
        }
 
                 scratch_pathname, bfd_errmsg (bfd_get_error ()));
        }
 
+      exec_bfd_mtime = bfd_get_mtime (exec_bfd);
+
       validate_files ();
 
       set_gdbarch_from_file (exec_bfd);
       validate_files ();
 
       set_gdbarch_from_file (exec_bfd);
@@ -275,7 +275,7 @@ exec_file_attach (char *filename, int from_tty)
        (*deprecated_exec_file_display_hook) (filename);
     }
   bfd_cache_close_all ();
        (*deprecated_exec_file_display_hook) (filename);
     }
   bfd_cache_close_all ();
-  observer_notify_executable_changed (NULL);
+  observer_notify_executable_changed ();
 }
 
 /*  Process the first arg in ARGS as the new exec file.
 }
 
 /*  Process the first arg in ARGS as the new exec file.
@@ -291,8 +291,11 @@ exec_file_command (char *args, int from_tty)
 {
   char **argv;
   char *filename;
 {
   char **argv;
   char *filename;
-  
-  target_preopen (from_tty);
+
+  if (from_tty && target_has_execution
+      && !query (_("A program is being debugged already.\n"
+                  "Are you sure you want to change the file? ")))
+    error (_("File not changed."));
 
   if (args)
     {
 
   if (args)
     {
@@ -346,11 +349,15 @@ add_to_section_table (bfd *abfd, struct bfd_section *asect,
   struct section_table **table_pp = (struct section_table **) table_pp_char;
   flagword aflag;
 
   struct section_table **table_pp = (struct section_table **) table_pp_char;
   flagword aflag;
 
+  /* Check the section flags, but do not discard zero-length sections, since
+     some symbols may still be attached to this section.  For instance, we
+     encountered on sparc-solaris 2.10 a shared library with an empty .bss
+     section to which a symbol named "_end" was attached.  The address
+     of this symbol still needs to be relocated.  */
   aflag = bfd_get_section_flags (abfd, asect);
   if (!(aflag & SEC_ALLOC))
     return;
   aflag = bfd_get_section_flags (abfd, asect);
   if (!(aflag & SEC_ALLOC))
     return;
-  if (0 == bfd_section_size (abfd, asect))
-    return;
+
   (*table_pp)->bfd = abfd;
   (*table_pp)->the_bfd_section = asect;
   (*table_pp)->addr = bfd_section_vma (abfd, asect);
   (*table_pp)->bfd = abfd;
   (*table_pp)->the_bfd_section = asect;
   (*table_pp)->addr = bfd_section_vma (abfd, asect);
@@ -459,7 +466,7 @@ xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
   int res;
   struct section_table *p;
   CORE_ADDR nextsectaddr, memend;
   int res;
   struct section_table *p;
   CORE_ADDR nextsectaddr, memend;
-  asection *section = NULL;
+  struct obj_section *section = NULL;
 
   if (len <= 0)
     internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
 
   if (len <= 0)
     internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
@@ -476,8 +483,9 @@ xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
 
   for (p = target->to_sections; p < target->to_sections_end; p++)
     {
 
   for (p = target->to_sections; p < target->to_sections_end; p++)
     {
-      if (overlay_debugging && section && p->the_bfd_section &&
-         strcmp (section->name, p->the_bfd_section->name) != 0)
+      if (overlay_debugging && section
+         && strcmp (section->the_bfd_section->name,
+                    p->the_bfd_section->name) != 0)
        continue;               /* not the section we need */
       if (memaddr >= p->addr)
         {
        continue;               /* not the section we need */
       if (memaddr >= p->addr)
         {
@@ -529,18 +537,15 @@ void
 print_section_info (struct target_ops *t, bfd *abfd)
 {
   struct section_table *p;
 print_section_info (struct target_ops *t, bfd *abfd)
 {
   struct section_table *p;
-  /* FIXME: 16 is not wide enough when TARGET_ADDR_BIT > 64.  */
-  int wid = TARGET_ADDR_BIT <= 32 ? 8 : 16;
+  /* FIXME: 16 is not wide enough when gdbarch_addr_bit > 64.  */
+  int wid = gdbarch_addr_bit (gdbarch_from_bfd (abfd)) <= 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 ("\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: "));
-      deprecated_print_address_numeric (bfd_get_start_address (abfd), 1, gdb_stdout);
-      printf_filtered ("\n");
-    }
+    printf_filtered (_("\tEntry point: %s\n"),
+                     paddress (bfd_get_start_address (abfd)));
   for (p = t->to_sections; p < t->to_sections_end; p++)
     {
       printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
   for (p = t->to_sections; p < t->to_sections_end; p++)
     {
       printf_filtered ("\t%s", hex_string_custom (p->addr, wid));
@@ -592,42 +597,6 @@ exec_files_info (struct target_ops *t)
     }
 }
 
     }
 }
 
-/* msnyder 5/21/99:
-   exec_set_section_offsets sets the offsets of all the sections
-   in the exec objfile.  */
-
-void
-exec_set_section_offsets (bfd_signed_vma text_off, bfd_signed_vma data_off,
-                         bfd_signed_vma bss_off)
-{
-  struct section_table *sect;
-
-  for (sect = exec_ops.to_sections;
-       sect < exec_ops.to_sections_end;
-       sect++)
-    {
-      flagword flags;
-
-      flags = bfd_get_section_flags (exec_bfd, sect->the_bfd_section);
-
-      if (flags & SEC_CODE)
-       {
-         sect->addr += text_off;
-         sect->endaddr += text_off;
-       }
-      else if (flags & (SEC_DATA | SEC_LOAD))
-       {
-         sect->addr += data_off;
-         sect->endaddr += data_off;
-       }
-      else if (flags & SEC_ALLOC)
-       {
-         sect->addr += bss_off;
-         sect->endaddr += bss_off;
-       }
-    }
-}
-
 static void
 set_section_command (char *args, int from_tty)
 {
 static void
 set_section_command (char *args, int from_tty)
 {
@@ -668,9 +637,8 @@ set_section_command (char *args, int from_tty)
   error (_("Section %s not found"), secprint);
 }
 
   error (_("Section %s not found"), secprint);
 }
 
-/* If we can find a section in FILENAME with BFD index INDEX, and the
-   user has not assigned an address to it yet (via "set section"), adjust it
-   to ADDRESS.  */
+/* If we can find a section in FILENAME with BFD index INDEX, adjust
+   it to ADDRESS.  */
 
 void
 exec_set_section_address (const char *filename, int index, CORE_ADDR address)
 
 void
 exec_set_section_address (const char *filename, int index, CORE_ADDR address)
@@ -680,11 +648,10 @@ exec_set_section_address (const char *filename, int index, CORE_ADDR address)
   for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
     {
       if (strcmp (filename, p->bfd->filename) == 0
   for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
     {
       if (strcmp (filename, p->bfd->filename) == 0
-         && index == p->the_bfd_section->index
-         && p->addr == 0)
+         && index == p->the_bfd_section->index)
        {
        {
+         p->endaddr += address - p->addr;
          p->addr = address;
          p->addr = address;
-         p->endaddr += address;
        }
     }
 }
        }
     }
 }
@@ -694,7 +661,7 @@ exec_set_section_address (const char *filename, int index, CORE_ADDR address)
    breakpoint_init_inferior).  */
 
 static int
    breakpoint_init_inferior).  */
 
 static int
-ignore (CORE_ADDR addr, bfd_byte *contents)
+ignore (struct bp_target_info *bp_tgt)
 {
   return 0;
 }
 {
   return 0;
 }
This page took 0.026771 seconds and 4 git commands to generate.