Mon Mar 23 13:52:28 1998 Ulrich Drepper (drepper@cygnus.com)

* breakpoint.c (breakpoint_re_set_one): Treat bp_shlib_events
        like bp_breakpoints.
        * solib.c (solib_create_inferior_hook): Relocate section addresses
        if the alleged start address doesn't agree with the PC.
This commit is contained in:
Jason Molenda 1998-03-23 21:58:12 +00:00
parent 7a22fb9fc3
commit 124e64bb67
2 changed files with 77 additions and 13 deletions

View File

@ -1,11 +1,18 @@
Mon Mar 23 13:52:28 1998 Ulrich Drepper (drepper@cygnus.com)
* breakpoint.c (breakpoint_re_set_one): Treat bp_shlib_events
like bp_breakpoints.
* solib.c (solib_create_inferior_hook): Relocate section addresses
if the alleged start address doesn't agree with the PC.
start-sanitize-sky
Mon Mar 23 13:07:22 1998 Frank Ch. Eigler <fche@cygnus.com>
* configure.in (sim-gpu2): Added --with-sim-gpu2 as configure
option, to allow gdb+sim linking with sky GPU2 library.
* configure: Regenerated.
end-sanitize-sky
Sat Mar 21 19:34:49 1998 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
merged changes from Foundry (list follows by file/author):

View File

@ -688,8 +688,7 @@ elf_locate_base ()
/* Find the DT_DEBUG entry in the the .dynamic section.
For mips elf we look for DT_MIPS_RLD_MAP, mips elf apparently has
no DT_DEBUG entries. */
/* FIXME: In lack of a 64 bit ELF ABI the following code assumes
a 32 bit ELF ABI target. */
#ifndef TARGET_ELF64
for (bufend = buf + dyninfo_sect_size;
buf < bufend;
buf += sizeof (Elf32_External_Dyn))
@ -720,6 +719,25 @@ elf_locate_base ()
}
#endif
}
#else /* ELF64 */
for (bufend = buf + dyninfo_sect_size;
buf < bufend;
buf += sizeof (Elf64_External_Dyn))
{
Elf64_External_Dyn *x_dynp = (Elf64_External_Dyn *)buf;
long dyn_tag;
CORE_ADDR dyn_ptr;
dyn_tag = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_tag);
if (dyn_tag == DT_NULL)
break;
else if (dyn_tag == DT_DEBUG)
{
dyn_ptr = bfd_h_get_64 (exec_bfd, (bfd_byte *) x_dynp->d_un.d_ptr);
return dyn_ptr;
}
}
#endif
/* DT_DEBUG entry not found. */
return 0;
@ -1190,30 +1208,41 @@ info_sharedlibrary_command (ignore, from_tty)
{
register struct so_list *so = NULL; /* link map state variable */
int header_done = 0;
int addr_width;
char *addr_fmt;
if (exec_bfd == NULL)
{
printf_unfiltered ("No exec file.\n");
return;
}
#ifndef TARGET_ELF64
addr_width = 8+4;
addr_fmt = "08l";
#else
addr_width = 16+4;
addr_fmt = "016l";
#endif
while ((so = find_solib (so)) != NULL)
{
if (so -> so_name[0])
{
if (!header_done)
{
printf_unfiltered("%-12s%-12s%-12s%s\n", "From", "To", "Syms Read",
"Shared Object Library");
printf_unfiltered("%-*s%-*s%-12s%s\n", addr_width, "From",
addr_width, "To", "Syms Read",
"Shared Object Library");
header_done++;
}
/* FIXME-32x64: need print_address_numeric with field width or
some such. */
printf_unfiltered ("%-12s",
printf_unfiltered ("%-*s", addr_width,
local_hex_string_custom ((unsigned long) LM_ADDR (so),
"08l"));
printf_unfiltered ("%-12s",
addr_fmt));
printf_unfiltered ("%-*s", addr_width,
local_hex_string_custom ((unsigned long) so -> lmend,
"08l"));
addr_fmt));
printf_unfiltered ("%-12s", so -> symbols_loaded ? "Yes" : "No");
printf_unfiltered ("%s\n", so -> so_name);
}
@ -1655,9 +1684,11 @@ FIXME
Also, what if child has exit()ed? Must exit loop somehow.
*/
void
void
solib_create_inferior_hook()
{
static int dyn_relocated;
/* If we are using the BKPT_AT_SYMBOL code, then we don't need the base
yet. In fact, in the case of a SunOS4 executable being run on
Solaris, we can't get it yet. find_solib will get it when it needs
@ -1676,6 +1707,32 @@ solib_create_inferior_hook()
return;
}
if (!dyn_relocated && exec_bfd->start_address != stop_pc)
{
/* We have to relocate the debug information. */
CORE_ADDR displacement = stop_pc - exec_bfd->start_address;
struct section_offsets *new_offsets;
int i;
new_offsets = alloca (symfile_objfile->num_sections
* sizeof (*new_offsets));
for (i = 0; i < symfile_objfile->num_sections; ++i)
ANOFFSET (new_offsets, i) =
ANOFFSET (symfile_objfile->section_offsets, i);
ANOFFSET (new_offsets, SECT_OFF_TEXT) += displacement;
ANOFFSET (new_offsets, SECT_OFF_DATA) += displacement;
ANOFFSET (new_offsets, SECT_OFF_BSS) += displacement;
ANOFFSET (new_offsets, SECT_OFF_RODATA) += displacement;
objfile_relocate (symfile_objfile, new_offsets);
breakpoint_re_set ();
/* Make sure this relocation is done only once. */
dyn_relocated = 1;
}
#ifndef SVR4_SHARED_LIBS
/* Only SunOS needs the loop below, other systems should be using the
special shared library breakpoints and the shared library breakpoint