* objdump.c (find_symbol_for_address): Prefer symbols in current
authorAlan Modra <amodra@gmail.com>
Mon, 7 Jul 2008 04:37:53 +0000 (04:37 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 7 Jul 2008 04:37:53 +0000 (04:37 +0000)
section.

binutils/ChangeLog
binutils/objdump.c

index ce2fa3bf25013acd96b9cb33eca7e6ffb5d10ea8..699abcfa445b25dac2d365b1404e9326781ef46c 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-07  Alan Modra  <amodra@bigpond.net.au>
+
+       * objdump.c (find_symbol_for_address): Prefer symbols in current
+       section.
+
 2008-07-07  Alan Modra  <amodra@bigpond.net.au>
 
        * ieee.c (write_ieee_debugging_info): Use bfd_make_section_with_flags.
index d171d14f4f5baad90bfcc3ff5306f7e8860522db..58947245ee46c88d100159135f4a2a71ae9e02c2 100644 (file)
@@ -740,6 +740,27 @@ find_symbol_for_address (bfd_vma vma,
             == bfd_asymbol_value (sorted_syms[thisplace - 1])))
     --thisplace;
 
+  /* Prefer a symbol in the current section if we have multple symbols
+     with the same value, as can occur with overlays or zero size
+     sections.  */
+  min = thisplace;
+  while (min < max
+        && (bfd_asymbol_value (sorted_syms[min])
+            == bfd_asymbol_value (sorted_syms[thisplace])))
+    {
+      if (sorted_syms[min]->section == sec
+         && info->symbol_is_valid (sorted_syms[min], info))
+       {
+         thisplace = min;
+
+         if (place != NULL)
+           *place = thisplace;
+
+         return sorted_syms[thisplace];
+       }
+      ++min;
+    }
+
   /* If the file is relocatable, and the symbol could be from this
      section, prefer a symbol from this section over symbols from
      others, even if the other symbol's value might be closer.
@@ -759,19 +780,9 @@ find_symbol_for_address (bfd_vma vma,
       || !info->symbol_is_valid (sorted_syms[thisplace], info))
     {
       long i;
-      long newplace;
-
-      for (i = thisplace + 1; i < sorted_symcount; i++)
-       {
-         if (bfd_asymbol_value (sorted_syms[i])
-             != bfd_asymbol_value (sorted_syms[thisplace]))
-           break;
-       }
-
-      --i;
-      newplace = sorted_symcount;
+      long newplace = sorted_symcount;
 
-      for (; i >= 0; i--)
+      for (i = min - 1; i >= 0; i--)
        {
          if ((sorted_syms[i]->section == sec || !want_section)
              && info->symbol_is_valid (sorted_syms[i], info))