2006-02-15 H.J. Lu <hongjiu.lu@intel.com>
authorH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Feb 2006 22:29:42 +0000 (22:29 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 15 Feb 2006 22:29:42 +0000 (22:29 +0000)
PR binutils/2338
* dwarf2.c (check_function_name): New function.
(_bfd_dwarf2_find_nearest_line): Use check_function_name to
check if function is correct.

bfd/ChangeLog
bfd/dwarf2.c

index c3479f07c315593fa7399617d6d80ee789238022..aa919c02b7cbeea12f549fd6a4e8d12a1142251a 100644 (file)
@@ -1,3 +1,10 @@
+2006-02-15  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/2338
+       * dwarf2.c (check_function_name): New function.
+       (_bfd_dwarf2_find_nearest_line): Use check_function_name to
+       check if function is correct.
+
 2006-02-16  Alan Modra  <amodra@bigpond.net.au>
 
        * elflink.c (_bfd_elf_default_action_discarded): Return 0 for
index 1d55e9ecb11e06758efbda8238bda186013cfc4d..f9cff9b89c9e3a71708f32a30f923a828f6dbf8b 100644 (file)
@@ -2179,6 +2179,34 @@ find_debug_info (bfd *abfd, asection *after_sec)
   return NULL;
 }
 
+/* Return TRUE if there is no mismatch bewteen function FUNC and
+   section SECTION from symbol table SYMBOLS in ABFD.  */
+
+static bfd_boolean
+check_function_name (bfd *abfd, asection *section, asymbol **symbols,
+                    const char *func)
+{
+  /* Mismatch can only happen when we have 2 functions with the same
+     address. It can only occur in a relocatable file.  */
+  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0
+      && func != NULL
+      && section != NULL
+      && symbols != NULL)
+    {
+      asymbol **p;
+
+      for (p = symbols; *p != NULL; p++)
+       {
+         if (((*p)->flags & BSF_FUNCTION) != 0
+             && (*p)->name != NULL
+             && strcmp ((*p)->name, func) == 0)
+           return (*p)->section == section;
+       }
+    }
+
+  return TRUE;
+}
+
 /* The DWARF2 version of find_nearest_line.  Return TRUE if the line
    is found without error.  ADDR_SIZE is the number of bytes in the
    initial .debug_info length field and in the abbreviation offset.
@@ -2300,7 +2328,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
     if (comp_unit_contains_address (each, addr)
        && comp_unit_find_nearest_line (each, addr, filename_ptr,
                                        functionname_ptr,
-                                       linenumber_ptr, stash))
+                                       linenumber_ptr, stash)
+       && check_function_name (abfd, section, symbols,
+                               *functionname_ptr))
       return TRUE;
 
   /* Read each remaining comp. units checking each as they are read.  */
@@ -2368,7 +2398,9 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
                                                  filename_ptr,
                                                  functionname_ptr,
                                                  linenumber_ptr,
-                                                 stash))
+                                                 stash)
+                 && check_function_name (abfd, section, symbols,
+                                         *functionname_ptr))
                return TRUE;
            }
        }