summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Blandy <jimb@codesourcery.com>2003-06-11 08:57:46 +0000
committerJim Blandy <jimb@codesourcery.com>2003-06-11 08:57:46 +0000
commitfd28d984fea20cbccf86fce2dfeacedaed1f8dcc (patch)
tree1c031dff7976d8136fe147cf4e7f04315a79a1eb
parent2ca59cbc0333a1c79f8e6956d08eae525cb77252 (diff)
downloadgdb-fd28d984fea20cbccf86fce2dfeacedaed1f8dcc.tar.gz
* 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.
-rw-r--r--gdb/solib-svr4.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 6c4c10ae013..b8a6a830bce 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -159,7 +159,7 @@ static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */
static int match_main (char *);
-static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
+static CORE_ADDR bfd_lookup_symbol (bfd *, char *, flagword);
/*
@@ -169,7 +169,7 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
SYNOPSIS
- CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname)
+ CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags)
DESCRIPTION
@@ -178,12 +178,15 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
shared library support to find the address of the debugger
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
such symbol).
*/
static CORE_ADDR
-bfd_lookup_symbol (bfd *abfd, char *symname)
+bfd_lookup_symbol (bfd *abfd, char *symname, flagword sect_flags)
{
long storage_needed;
asymbol *sym;
@@ -204,7 +207,8 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
for (i = 0; i < number_of_symbols; i++)
{
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. */
symaddr = sym->value + sym->section->vma;
@@ -231,7 +235,9 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
for (i = 0; i < number_of_symbols; i++)
{
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. */
symaddr = sym->value + sym->section->vma;
@@ -337,7 +343,7 @@ look_for_base (int fd, CORE_ADDR baseaddr)
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)
{
break;
@@ -1039,7 +1045,16 @@ enable_break (void)
/* Now try to set a breakpoint in the dynamic linker. */
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)
break;
}