* solib-svr4.c (bfd_lookup_symbol): New SECT_FLAGS argument.

(enable_break): Pass SEC_CODE as the SECT_FLAGS argument to
bfd_lookup_symbol, since we only want symbols in code sections.
(look_for_base): Pass zero as the SECT_FLAGS argument to
bfd_lookup_symbol, since we're not concerned about which section
the symbol is in.
This commit is contained in:
Jim Blandy 2003-08-26 23:35:19 +00:00
parent 102d615a7c
commit 87f84c9d11
2 changed files with 31 additions and 7 deletions

View File

@ -1,3 +1,12 @@
2003-08-26 Jim Blandy <jimb@redhat.com>
* solib-svr4.c (bfd_lookup_symbol): New SECT_FLAGS argument.
(enable_break): Pass SEC_CODE as the SECT_FLAGS argument to
bfd_lookup_symbol, since we only want symbols in code sections.
(look_for_base): Pass zero as the SECT_FLAGS argument to
bfd_lookup_symbol, since we're not concerned about which section
the symbol is in.
2003-08-26 Jeff Johnston <jjohnstn@redhat.com> 2003-08-26 Jeff Johnston <jjohnstn@redhat.com>
* ia64-tdep.c (examine_prologue): Only stop at predicated insns if * ia64-tdep.c (examine_prologue): Only stop at predicated insns if

View File

@ -177,7 +177,7 @@ static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
static int match_main (char *); static int match_main (char *);
static CORE_ADDR bfd_lookup_symbol (bfd *, char *); static CORE_ADDR bfd_lookup_symbol (bfd *, char *, flagword);
/* /*
@ -187,7 +187,7 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
SYNOPSIS SYNOPSIS
CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname) CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags)
DESCRIPTION DESCRIPTION
@ -196,12 +196,15 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
shared library support to find the address of the debugger shared library support to find the address of the debugger
interface structures in the shared library. interface structures in the shared library.
If SECT_FLAGS is non-zero, only match symbols in sections whose
flags include all those in SECT_FLAGS.
Note that 0 is specifically allowed as an error return (no Note that 0 is specifically allowed as an error return (no
such symbol). such symbol).
*/ */
static CORE_ADDR static CORE_ADDR
bfd_lookup_symbol (bfd *abfd, char *symname) bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags)
{ {
long storage_needed; long storage_needed;
asymbol *sym; asymbol *sym;
@ -222,7 +225,8 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
for (i = 0; i < number_of_symbols; i++) for (i = 0; i < number_of_symbols; i++)
{ {
sym = *symbol_table++; sym = *symbol_table++;
if (STREQ (sym->name, symname)) if (STREQ (sym->name, symname)
&& (sym->section->flags & sect_flags) == sect_flags)
{ {
/* Bfd symbols are section relative. */ /* Bfd symbols are section relative. */
symaddr = sym->value + sym->section->vma; symaddr = sym->value + sym->section->vma;
@ -249,7 +253,9 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
for (i = 0; i < number_of_symbols; i++) for (i = 0; i < number_of_symbols; i++)
{ {
sym = *symbol_table++; sym = *symbol_table++;
if (STREQ (sym->name, symname))
if (STREQ (sym->name, symname)
&& (sym->section->flags & sect_flags) == sect_flags)
{ {
/* Bfd symbols are section relative. */ /* Bfd symbols are section relative. */
symaddr = sym->value + sym->section->vma; symaddr = sym->value + sym->section->vma;
@ -355,7 +361,7 @@ look_for_base (int fd, CORE_ADDR baseaddr)
for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++) for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
{ {
address = bfd_lookup_symbol (interp_bfd, *symbolp); address = bfd_lookup_symbol (interp_bfd, *symbolp, 0);
if (address != 0) if (address != 0)
{ {
break; break;
@ -1060,7 +1066,16 @@ enable_break (void)
/* Now try to set a breakpoint in the dynamic linker. */ /* Now try to set a breakpoint in the dynamic linker. */
for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++)
{ {
sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep); /* On ABI's that use function descriptors, there are usually
two linker symbols associated with each C function: one
pointing at the actual entry point of the machine code,
and one pointing at the function's descriptor. The
latter symbol has the same name as the C function.
What we're looking for here is the machine code entry
point, so we are only interested in symbols in code
sections. */
sym_addr = bfd_lookup_symbol (tmp_bfd, *bkpt_namep, SEC_CODE);
if (sym_addr != 0) if (sym_addr != 0)
break; break;
} }