]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
* solib-svr4.c (bfd_lookup_symbol): New SECT_FLAGS argument.
authorJim Blandy <jimb@codesourcery.com>
Fri, 13 Jun 2003 23:57:26 +0000 (23:57 +0000)
committerJim Blandy <jimb@codesourcery.com>
Fri, 13 Jun 2003 23:57:26 +0000 (23:57 +0000)
(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.

gdb/ChangeLog
gdb/solib-svr4.c

index 8b197bd692ef158cc9fc2b4e0fd4edab521704bb..6fabe08ea4e3b43bdadd35382a0ba00050fc5ca2 100644 (file)
@@ -1,5 +1,12 @@
 2003-06-13  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.
+
        * gdbarch.sh (gdbarch_bfd_entry_point): New gdbarch method.
        * arch-utils.c (generic_bfd_entry_point): New function.
        * arch-utils.h (generic_bfd_entry_point): New declaration.
index 6a866560cebe04fdd086c6dc307f47a11256ddbe..3ab247248d8e228d2a7f4704efbd156667f9e044 100644 (file)
@@ -177,7 +177,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);
 
 /*
 
@@ -187,7 +187,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
 
@@ -196,12 +196,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;
@@ -222,7 +225,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;
@@ -249,7 +253,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;
@@ -355,7 +361,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;
@@ -1061,7 +1067,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;
        }