/* 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 Free Software Foundation, Inc.
This file is part of GDB.
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. */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
#include "defs.h"
#include "frame.h"
#include <ctype.h>
#include "gdb_stat.h"
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
#include "xcoffsolib.h"
static void exec_files_info (struct target_ops *);
-static int ignore (CORE_ADDR, char *);
-
static void init_exec_ops (void);
void _initialize_exec (void);
struct vmap *vmap;
-void
+static void
exec_open (char *args, int from_tty)
{
target_preopen (from_tty);
{
if (from_tty)
printf_unfiltered (_("No executable file now.\n"));
+
+ set_gdbarch_from_file (NULL);
}
else
{
#endif
if (scratch_chan < 0)
perror_with_name (filename);
- exec_bfd = bfd_fdopenr (scratch_pathname, gnutarget, scratch_chan);
+ exec_bfd = bfd_fopen (scratch_pathname, gnutarget,
+ write_files ? FOPEN_RUB : FOPEN_RB,
+ scratch_chan);
if (!exec_bfd)
error (_("\"%s\": could not open as an executable file: %s"),
scratch_pathname, bfd_errmsg (bfd_get_error ()));
}
-#ifdef DEPRECATED_HPUX_TEXT_END
- DEPRECATED_HPUX_TEXT_END (&exec_ops);
-#endif
-
validate_files ();
set_gdbarch_from_file (exec_bfd);
{
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)
{
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;
- 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);
if ((bfd_get_section_flags (abfd, sect) & SEC_LOAD) == 0)
return;
- if (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".text"))
+ if (strcmp (bfd_section_name (abfd, sect), ".text") == 0)
{
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 (DEPRECATED_STREQ (bfd_section_name (abfd, sect), ".data"))
+ else if (strcmp (bfd_section_name (abfd, sect), ".data") == 0)
{
vp->dstart = bfd_section_vma (abfd, sect);
vp->dend = vp->dstart + bfd_section_size (abfd, sect);
we just tail-call it with more arguments to select between them. */
int
-xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
- struct mem_attrib *attrib,
- struct target_ops *target)
+xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
+ struct mem_attrib *attrib, struct target_ops *target)
{
int res;
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 (current_gdbarch) <= 32 ? 8 : 16;
printf_filtered ("\t`%s', ", bfd_get_filename (abfd));
wrap_here (" ");
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. */
+
+void
+exec_set_section_address (const char *filename, int index, CORE_ADDR address)
+{
+ struct section_table *p;
+
+ 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)
+ {
+ p->addr = address;
+ p->endaddr += address;
+ }
+ }
+}
+
/* 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 (CORE_ADDR addr, char *contents)
+ignore (struct bp_target_info *bp_tgt)
{
return 0;
}