* solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Do not ignore the

first entry for static executables.
	(breakpoint_addr): Delete unused variable.
	(elf_locate_base): Search for _r_debug in static executables.
	(enable_break): Do not set breakpoint_addr.  Scan solib_break_names
	also.
This commit is contained in:
Daniel Jacobowitz 2007-04-13 13:54:06 +00:00
parent 4d5b2cd774
commit e499d0f17e
2 changed files with 38 additions and 5 deletions

View File

@ -1,3 +1,12 @@
2007-04-13 Daniel Jacobowitz <dan@codesourcery.com>
* solib-svr4.c (IGNORE_FIRST_LINK_MAP_ENTRY): Do not ignore the
first entry for static executables.
(breakpoint_addr): Delete unused variable.
(elf_locate_base): Search for _r_debug in static executables.
(enable_break): Do not set breakpoint_addr. Scan solib_break_names
also.
2007-04-13 Daniel Jacobowitz <dan@codesourcery.com>
* breakpoint.c (update_breakpoints_after_exec, print_it_typical)

View File

@ -239,12 +239,16 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so)
{
struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
/* Assume that everything is a library if the dynamic loader was loaded
late by a static executable. */
if (bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL)
return 0;
return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset,
builtin_type_void_data_ptr) == 0;
}
static CORE_ADDR debug_base; /* Base of dynamic linker structures */
static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
/* Validity flag for debug_loader_offset. */
static int debug_loader_offset_p;
@ -387,7 +391,18 @@ elf_locate_base (void)
/* Find the start address of the .dynamic section. */
dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic");
if (dyninfo_sect == NULL)
return 0;
{
/* This may be a static executable. Look for the symbol
conventionally named _r_debug, as a last resort. */
struct minimal_symbol *msymbol;
msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile);
if (msymbol != NULL)
return SYMBOL_VALUE_ADDRESS (msymbol);
else
return 0;
}
dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect);
/* Read in .dynamic section, silently ignore errors. */
@ -1111,10 +1126,19 @@ enable_break (void)
"and track explicitly loaded dynamic code."));
}
/* Scan through the list of symbols, trying to look up the symbol and
set a breakpoint there. Terminate loop when we/if we succeed. */
/* Scan through the lists of symbols, trying to look up the symbol and
set a breakpoint there. Terminate loop when we/if we succeed. */
for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
{
msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
{
create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
return 1;
}
}
breakpoint_addr = 0;
for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
{
msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);