* main.c (main): Remove calls to {pre,post}_add_symbol_hooks.
There should be sufficient information/hooks now to eliminate this hack. * exec.c (file_command): Add a new hook here to inform ui's when the exec file has changed. Adding it here allows the ui to be informed after symbol reading. * gdbcore.h: Add declaration of file_changed_hook.
This commit is contained in:
parent
d7a198b636
commit
d367c7b447
2 changed files with 85 additions and 18 deletions
|
@ -1,3 +1,15 @@
|
|||
1998-10-08 Keith Seitz <keiths@cygnus.com>
|
||||
|
||||
* main.c (main): Remove calls to {pre,post}_add_symbol_hooks.
|
||||
There should be sufficient information/hooks now to eliminate
|
||||
this hack.
|
||||
|
||||
* exec.c (file_command): Add a new hook here to inform ui's
|
||||
when the exec file has changed. Adding it here allows the
|
||||
ui to be informed after symbol reading.
|
||||
|
||||
* gdbcore.h: Add declaration of file_changed_hook.
|
||||
|
||||
Thu Oct 8 08:40:42 1998 Mark Alexander <marka@cygnus.com>
|
||||
|
||||
* rs6000-tdep.c (get_saved_register): Define only if
|
||||
|
|
91
gdb/exec.c
91
gdb/exec.c
|
@ -1,5 +1,6 @@
|
|||
/* Work with executable files, for GDB.
|
||||
Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright 1988, 1989, 1991, 1992, 1993, 1994, 1997
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -30,7 +31,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <fcntl.h>
|
||||
#include "gdb_string.h"
|
||||
|
||||
|
@ -46,6 +46,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
|||
|
||||
struct vmap *map_vmap PARAMS ((bfd *, bfd *));
|
||||
|
||||
void (*file_changed_hook) PARAMS ((char *));
|
||||
|
||||
/* Prototypes for local functions */
|
||||
|
||||
static void add_to_section_table PARAMS ((bfd *, sec_ptr, PTR));
|
||||
|
@ -187,7 +189,7 @@ exec_file_command (args, from_tty)
|
|||
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)
|
||||
if (scratch_chan < 0)
|
||||
{
|
||||
char *exename = alloca (strlen (filename) + 5);
|
||||
|
@ -277,6 +279,7 @@ exec_file_command (args, from_tty)
|
|||
validate_files ();
|
||||
|
||||
set_endian_from_file (exec_bfd);
|
||||
set_architecture_from_file (exec_bfd);
|
||||
|
||||
push_target (&exec_ops);
|
||||
|
||||
|
@ -285,7 +288,7 @@ exec_file_command (args, from_tty)
|
|||
(*exec_file_display_hook) (filename);
|
||||
}
|
||||
else if (from_tty)
|
||||
printf_unfiltered ("No exec file now.\n");
|
||||
printf_unfiltered ("No executable file now.\n");
|
||||
}
|
||||
|
||||
/* Set both the exec file and the symbol file, in one command.
|
||||
|
@ -301,6 +304,8 @@ file_command (arg, 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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -367,20 +372,16 @@ bfdsec_to_vmap(abfd, sect, arg3)
|
|||
|
||||
if (STREQ (bfd_section_name (abfd, sect), ".text"))
|
||||
{
|
||||
vp->tstart = 0;
|
||||
vp->tstart = bfd_section_vma (abfd, sect);
|
||||
vp->tend = vp->tstart + bfd_section_size (abfd, sect);
|
||||
|
||||
/* When it comes to this adjustment value, in contrast to our previous
|
||||
belief shared objects should behave the same as the main load segment.
|
||||
This is the offset from the beginning of text section to the first
|
||||
real instruction. */
|
||||
|
||||
vp->tadj = sect->filepos - bfd_section_vma (abfd, sect);
|
||||
vp->tvma = bfd_section_vma (abfd, sect);
|
||||
vp->toffs = sect->filepos;
|
||||
}
|
||||
else if (STREQ (bfd_section_name (abfd, sect), ".data"))
|
||||
{
|
||||
vp->dstart = 0;
|
||||
vp->dstart = bfd_section_vma (abfd, sect);
|
||||
vp->dend = vp->dstart + bfd_section_size (abfd, sect);
|
||||
vp->dvma = bfd_section_vma (abfd, sect);
|
||||
}
|
||||
/* Silently ignore other types of sections. (FIXME?) */
|
||||
}
|
||||
|
@ -445,25 +446,79 @@ xfer_memory (memaddr, myaddr, len, write, target)
|
|||
struct section_table *p;
|
||||
CORE_ADDR nextsectaddr, memend;
|
||||
boolean (*xfer_fn) PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
|
||||
asection *section;
|
||||
|
||||
if (len <= 0)
|
||||
abort();
|
||||
|
||||
if (overlay_debugging)
|
||||
{
|
||||
section = find_pc_overlay (memaddr);
|
||||
if (pc_in_unmapped_range (memaddr, section))
|
||||
memaddr = overlay_mapped_address (memaddr, section);
|
||||
}
|
||||
|
||||
memend = memaddr + len;
|
||||
xfer_fn = write ? bfd_set_section_contents : bfd_get_section_contents;
|
||||
nextsectaddr = memend;
|
||||
|
||||
#if 0 /* Stu's implementation */
|
||||
/* If a section has been specified, try to use it. Note that we cannot use the
|
||||
specified section directly. This is because it usually comes from the
|
||||
symbol file, which may be different from the exec or core file. Instead, we
|
||||
have to lookup the specified section by name in the bfd associated with
|
||||
to_sections. */
|
||||
|
||||
if (target_memory_bfd_section)
|
||||
{
|
||||
asection *s;
|
||||
bfd *abfd;
|
||||
asection *target_section;
|
||||
bfd *target_bfd;
|
||||
|
||||
s = target_memory_bfd_section;
|
||||
abfd = s->owner;
|
||||
|
||||
target_bfd = target->to_sections->bfd;
|
||||
target_section = bfd_get_section_by_name (target_bfd, bfd_section_name (abfd, s));
|
||||
|
||||
if (target_section)
|
||||
{
|
||||
bfd_vma sec_addr;
|
||||
bfd_size_type sec_size;
|
||||
|
||||
sec_addr = bfd_section_vma (target_bfd, target_section);
|
||||
sec_size = target_section->_raw_size;
|
||||
|
||||
/* Make sure the requested memory starts inside the section. */
|
||||
|
||||
if (memaddr >= sec_addr
|
||||
&& memaddr < sec_addr + sec_size)
|
||||
{
|
||||
/* Cut back length in case request overflows the end of the section. */
|
||||
len = min (len, sec_addr + sec_size - memaddr);
|
||||
|
||||
res = xfer_fn (target_bfd, target_section, myaddr, memaddr - sec_addr, len);
|
||||
|
||||
return res ? len : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* 0, Stu's implementation */
|
||||
for (p = target->to_sections; p < target->to_sections_end; p++)
|
||||
{
|
||||
if (p->addr <= memaddr)
|
||||
if (p->endaddr >= memend)
|
||||
if (overlay_debugging && section && p->the_bfd_section &&
|
||||
strcmp (section->name, p->the_bfd_section->name) != 0)
|
||||
continue; /* not the section we need */
|
||||
if (memaddr >= p->addr)
|
||||
if (memend <= p->endaddr)
|
||||
{
|
||||
/* Entire transfer is within this section. */
|
||||
res = xfer_fn (p->bfd, p->the_bfd_section, myaddr,
|
||||
memaddr - p->addr, len);
|
||||
return (res != 0) ? len : 0;
|
||||
}
|
||||
else if (p->endaddr <= memaddr)
|
||||
else if (memaddr >= p->endaddr)
|
||||
{
|
||||
/* This section ends before the transfer starts. */
|
||||
continue;
|
||||
|
@ -476,8 +531,8 @@ xfer_memory (memaddr, myaddr, len, write, target)
|
|||
memaddr - p->addr, len);
|
||||
return (res != 0) ? len : 0;
|
||||
}
|
||||
else if (p->addr < nextsectaddr)
|
||||
nextsectaddr = p->addr;
|
||||
else
|
||||
nextsectaddr = min (nextsectaddr, p->addr);
|
||||
}
|
||||
|
||||
if (nextsectaddr >= memend)
|
||||
|
|
Loading…
Reference in a new issue