gdb/
Remove INVALID_ENTRY_POINT. * frame.c (inside_entry_func): New variable entry_point. Return 0 if the entry point is not known. * solib-irix.c (enable_break): Likewise. * objfiles.c (init_entry_point_info): Stop using INVALID_ENTRY_POINT. Initialize EI.ENTRY_POINT_P. (entry_point_address): Rename to ... (entry_point_address_query): ... a new function. Use EI.ENTRY_POINT_P. (entry_point_address): New function. (objfile_relocate): Use EI.ENTRY_POINT_P. * objfiles.h (struct entry_info): Simplify entry_point comment. New field entry_point_p. (INVALID_ENTRY_POINT): Remove. (entry_point_address_query): New prototype. * solib-frv.c (enable_break): Check for NULL SYMFILE_OBJFILE and its EI.ENTRY_POINT_P. Return 0 if ".interp" is not found.
This commit is contained in:
parent
62f3b8c867
commit
abd0a5fa91
6 changed files with 93 additions and 37 deletions
|
@ -1,3 +1,22 @@
|
||||||
|
2009-11-02 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Remove INVALID_ENTRY_POINT.
|
||||||
|
* frame.c (inside_entry_func): New variable entry_point. Return 0 if
|
||||||
|
the entry point is not known.
|
||||||
|
* solib-irix.c (enable_break): Likewise.
|
||||||
|
* objfiles.c (init_entry_point_info): Stop using INVALID_ENTRY_POINT.
|
||||||
|
Initialize EI.ENTRY_POINT_P.
|
||||||
|
(entry_point_address): Rename to ...
|
||||||
|
(entry_point_address_query): ... a new function. Use EI.ENTRY_POINT_P.
|
||||||
|
(entry_point_address): New function.
|
||||||
|
(objfile_relocate): Use EI.ENTRY_POINT_P.
|
||||||
|
* objfiles.h (struct entry_info): Simplify entry_point comment. New
|
||||||
|
field entry_point_p.
|
||||||
|
(INVALID_ENTRY_POINT): Remove.
|
||||||
|
(entry_point_address_query): New prototype.
|
||||||
|
* solib-frv.c (enable_break): Check for NULL SYMFILE_OBJFILE and its
|
||||||
|
EI.ENTRY_POINT_P. Return 0 if ".interp" is not found.
|
||||||
|
|
||||||
2009-11-01 Michael Snyder <msnyder@vmware.com>
|
2009-11-01 Michael Snyder <msnyder@vmware.com>
|
||||||
|
|
||||||
* NEWS (New Commands): Mention record save/restore.
|
* NEWS (New Commands): Mention record save/restore.
|
||||||
|
|
|
@ -1650,7 +1650,12 @@ inside_main_func (struct frame_info *this_frame)
|
||||||
static int
|
static int
|
||||||
inside_entry_func (struct frame_info *this_frame)
|
inside_entry_func (struct frame_info *this_frame)
|
||||||
{
|
{
|
||||||
return (get_frame_func (this_frame) == entry_point_address ());
|
CORE_ADDR entry_point;
|
||||||
|
|
||||||
|
if (!entry_point_address_query (&entry_point))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return get_frame_func (this_frame) == entry_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return a structure containing various interesting information about
|
/* Return a structure containing various interesting information about
|
||||||
|
|
|
@ -294,29 +294,34 @@ init_entry_point_info (struct objfile *objfile)
|
||||||
/* Executable file -- record its entry point so we'll recognize
|
/* Executable file -- record its entry point so we'll recognize
|
||||||
the startup file because it contains the entry point. */
|
the startup file because it contains the entry point. */
|
||||||
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
|
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
|
||||||
|
objfile->ei.entry_point_p = 1;
|
||||||
}
|
}
|
||||||
else if (bfd_get_file_flags (objfile->obfd) & DYNAMIC
|
else if (bfd_get_file_flags (objfile->obfd) & DYNAMIC
|
||||||
&& bfd_get_start_address (objfile->obfd) != 0)
|
&& bfd_get_start_address (objfile->obfd) != 0)
|
||||||
/* Some shared libraries may have entry points set and be
|
{
|
||||||
runnable. There's no clear way to indicate this, so just check
|
/* Some shared libraries may have entry points set and be
|
||||||
for values other than zero. */
|
runnable. There's no clear way to indicate this, so just check
|
||||||
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
|
for values other than zero. */
|
||||||
|
objfile->ei.entry_point = bfd_get_start_address (objfile->obfd);
|
||||||
|
objfile->ei.entry_point_p = 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Examination of non-executable.o files. Short-circuit this stuff. */
|
/* Examination of non-executable.o files. Short-circuit this stuff. */
|
||||||
objfile->ei.entry_point = INVALID_ENTRY_POINT;
|
objfile->ei.entry_point_p = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get current entry point address. */
|
/* If there is a valid and known entry point, function fills *ENTRY_P with it
|
||||||
|
and returns non-zero; otherwise it returns zero. */
|
||||||
|
|
||||||
CORE_ADDR
|
int
|
||||||
entry_point_address (void)
|
entry_point_address_query (CORE_ADDR *entry_p)
|
||||||
{
|
{
|
||||||
struct gdbarch *gdbarch;
|
struct gdbarch *gdbarch;
|
||||||
CORE_ADDR entry_point;
|
CORE_ADDR entry_point;
|
||||||
|
|
||||||
if (symfile_objfile == NULL)
|
if (symfile_objfile == NULL || !symfile_objfile->ei.entry_point_p)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
gdbarch = get_objfile_arch (symfile_objfile);
|
gdbarch = get_objfile_arch (symfile_objfile);
|
||||||
|
@ -332,7 +337,21 @@ entry_point_address (void)
|
||||||
symbol table. */
|
symbol table. */
|
||||||
entry_point = gdbarch_addr_bits_remove (gdbarch, entry_point);
|
entry_point = gdbarch_addr_bits_remove (gdbarch, entry_point);
|
||||||
|
|
||||||
return entry_point;
|
*entry_p = entry_point;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get current entry point address. Call error if it is not known. */
|
||||||
|
|
||||||
|
CORE_ADDR
|
||||||
|
entry_point_address (void)
|
||||||
|
{
|
||||||
|
CORE_ADDR retval;
|
||||||
|
|
||||||
|
if (!entry_point_address_query (&retval))
|
||||||
|
error (_("Entry point address is not known."));
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the terminating entry of OBJFILE's minimal symbol table.
|
/* Create the terminating entry of OBJFILE's minimal symbol table.
|
||||||
|
@ -702,7 +721,7 @@ objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
|
||||||
to be out of order. */
|
to be out of order. */
|
||||||
msymbols_sort (objfile);
|
msymbols_sort (objfile);
|
||||||
|
|
||||||
if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
|
if (objfile->ei.entry_point_p)
|
||||||
{
|
{
|
||||||
/* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
|
/* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
|
||||||
only as a fallback. */
|
only as a fallback. */
|
||||||
|
|
|
@ -100,15 +100,11 @@ struct objfile_data;
|
||||||
|
|
||||||
struct entry_info
|
struct entry_info
|
||||||
{
|
{
|
||||||
|
/* The relocated value we should use for this objfile entry point. */
|
||||||
/* The value we should use for this objects entry point.
|
|
||||||
The illegal/unknown value needs to be something other than 0, ~0
|
|
||||||
for instance, which is much less likely than 0. */
|
|
||||||
|
|
||||||
CORE_ADDR entry_point;
|
CORE_ADDR entry_point;
|
||||||
|
|
||||||
#define INVALID_ENTRY_POINT (~0) /* ~0 will not be in any file, we hope. */
|
/* Set to 1 iff ENTRY_POINT contains a valid value. */
|
||||||
|
unsigned entry_point_p : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Sections in an objfile. The section offsets are stored in the
|
/* Sections in an objfile. The section offsets are stored in the
|
||||||
|
@ -447,6 +443,8 @@ extern struct gdbarch *get_objfile_arch (struct objfile *);
|
||||||
|
|
||||||
extern void init_entry_point_info (struct objfile *);
|
extern void init_entry_point_info (struct objfile *);
|
||||||
|
|
||||||
|
extern int entry_point_address_query (CORE_ADDR *entry_p);
|
||||||
|
|
||||||
extern CORE_ADDR entry_point_address (void);
|
extern CORE_ADDR entry_point_address (void);
|
||||||
|
|
||||||
extern int build_objfile_section_table (struct objfile *);
|
extern int build_objfile_section_table (struct objfile *);
|
||||||
|
|
|
@ -822,30 +822,43 @@ enable_break (void)
|
||||||
may have changed since the last time we ran the program. */
|
may have changed since the last time we ran the program. */
|
||||||
remove_solib_event_breakpoints ();
|
remove_solib_event_breakpoints ();
|
||||||
|
|
||||||
|
if (symfile_objfile == NULL)
|
||||||
|
{
|
||||||
|
if (solib_frv_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"enable_break: No symbol file found.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!symfile_objfile->ei.entry_point_p)
|
||||||
|
{
|
||||||
|
if (solib_frv_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"enable_break: Symbol file has no entry point.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for the presence of a .interp section. If there is no
|
/* Check for the presence of a .interp section. If there is no
|
||||||
such section, the executable is statically linked. */
|
such section, the executable is statically linked. */
|
||||||
|
|
||||||
interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
|
interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
|
||||||
|
|
||||||
if (interp_sect)
|
if (interp_sect == NULL)
|
||||||
{
|
|
||||||
enable_break1_done = 1;
|
|
||||||
create_solib_event_breakpoint (target_gdbarch,
|
|
||||||
symfile_objfile->ei.entry_point);
|
|
||||||
|
|
||||||
if (solib_frv_debug)
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"enable_break: solib event breakpoint placed at entry point: %s\n",
|
|
||||||
hex_string_custom
|
|
||||||
(symfile_objfile->ei.entry_point, 8));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (solib_frv_debug)
|
if (solib_frv_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
"enable_break: No .interp section found.\n");
|
"enable_break: No .interp section found.\n");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enable_break1_done = 1;
|
||||||
|
create_solib_event_breakpoint (target_gdbarch,
|
||||||
|
symfile_objfile->ei.entry_point);
|
||||||
|
|
||||||
|
if (solib_frv_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"enable_break: solib event breakpoint placed at entry point: %s\n",
|
||||||
|
hex_string_custom (symfile_objfile->ei.entry_point, 8));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -369,11 +369,13 @@ enable_break (void)
|
||||||
{
|
{
|
||||||
struct frame_info *frame = get_current_frame ();
|
struct frame_info *frame = get_current_frame ();
|
||||||
struct address_space *aspace = get_frame_address_space (frame);
|
struct address_space *aspace = get_frame_address_space (frame);
|
||||||
|
CORE_ADDR entry_point;
|
||||||
|
|
||||||
base_breakpoint
|
if (!entry_point_address_query (&entry_point))
|
||||||
= deprecated_insert_raw_breakpoint (target_gdbarch,
|
return 0;
|
||||||
aspace,
|
|
||||||
entry_point_address ());
|
base_breakpoint = deprecated_insert_raw_breakpoint (target_gdbarch,
|
||||||
|
aspace, entry_point);
|
||||||
|
|
||||||
if (base_breakpoint != NULL)
|
if (base_breakpoint != NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue