* solib-svr4.c (bfd_lookup_symbol): New SECT_FLAGS argument.
authorJim Blandy <jimb@codesourcery.com>
Tue, 26 Aug 2003 23:35:19 +0000 (23:35 +0000)
committerJim Blandy <jimb@codesourcery.com>
Tue, 26 Aug 2003 23:35:19 +0000 (23:35 +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 25bd8a16be1e18bfeb24f90dbc24d59a9a0dd1e8..cdf758130dad35e69088a5d4f909b7b7105c163b 100644 (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>
 
        * ia64-tdep.c (examine_prologue): Only stop at predicated insns if
index 5ff6ba63ac8e7a9dfd7495e4cbc4e60f97ee1b3d..7fda5e4e0202b1a6289441251ec1f4131ebf7cee 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;
@@ -1060,7 +1066,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;
        }
This page took 0.034376 seconds and 4 git commands to generate.