Nick Clifton 6766a3
--- binutils.orig/binutils/objdump.c	2018-03-05 17:04:19.901619738 +0000
Nick Clifton 6766a3
+++ binutils-2.29/binutils/objdump.c	2018-03-05 17:10:08.334643096 +0000
Nick Clifton 6766a3
@@ -664,9 +664,7 @@ slurp_dynamic_symtab (bfd *abfd)
Nick Clifton 6766a3
 static bfd_boolean
Nick Clifton 6766a3
 is_significant_symbol_name (const char * name)
Nick Clifton 6766a3
 {
Nick Clifton 6766a3
-  return strcmp (name, ".plt") == 0
Nick Clifton 6766a3
-    ||   strcmp (name, ".got") == 0
Nick Clifton 6766a3
-    ||   strcmp (name, ".plt.got") == 0;
Nick Clifton 6766a3
+  return strncmp (name, ".plt", 4) == 0 || strcmp (name, ".got") == 0;
Nick Clifton 6766a3
 }
Nick Clifton 6766a3
 
Nick Clifton 6766a3
 /* Filter out (in place) symbols that are useless for disassembly.
Nick Clifton 6766a3
@@ -937,6 +935,7 @@ find_symbol_for_address (bfd_vma vma,
Nick Clifton 6766a3
   asection *sec;
Nick Clifton 6766a3
   unsigned int opb;
Nick Clifton 6766a3
   bfd_boolean want_section;
Nick Clifton 6766a3
+  long rel_count;
Nick Clifton 6766a3
 
Nick Clifton 6766a3
   if (sorted_symcount < 1)
Nick Clifton 6766a3
     return NULL;
Nick Clifton 6766a3
@@ -1065,33 +1064,59 @@ find_symbol_for_address (bfd_vma vma,
Nick Clifton 6766a3
      and we have dynamic relocations available, then we can produce
Nick Clifton 6766a3
      a better result by matching a relocation to the address and
Nick Clifton 6766a3
      using the symbol associated with that relocation.  */
Nick Clifton 6766a3
+  rel_count = aux->dynrelcount;
Nick Clifton 6766a3
   if (!want_section
Nick Clifton 6766a3
-      && aux->dynrelbuf != NULL
Nick Clifton 6766a3
       && sorted_syms[thisplace]->value != vma
Nick Clifton 6766a3
+      && rel_count > 0
Nick Clifton 6766a3
+      && aux->dynrelbuf != NULL
Nick Clifton 6766a3
+      && aux->dynrelbuf[0]->address <= vma
Nick Clifton 6766a3
+      && aux->dynrelbuf[rel_count - 1]->address >= vma
Nick Clifton 6766a3
       /* If we have matched a synthetic symbol, then stick with that.  */
Nick Clifton 6766a3
       && (sorted_syms[thisplace]->flags & BSF_SYNTHETIC) == 0)
Nick Clifton 6766a3
     {
Nick Clifton 6766a3
-      long        rel_count;
Nick Clifton 6766a3
-      arelent **  rel_pp;
Nick Clifton 6766a3
+      arelent **  rel_low;
Nick Clifton 6766a3
+      arelent **  rel_high;
Nick Clifton 6766a3
 
Nick Clifton 6766a3
-      for (rel_count = aux->dynrelcount, rel_pp = aux->dynrelbuf;
Nick Clifton 6766a3
-	   rel_count--;)
Nick Clifton 6766a3
+      rel_low = aux->dynrelbuf;
Nick Clifton 6766a3
+      rel_high = rel_low + rel_count - 1;
Nick Clifton 6766a3
+      while (rel_low <= rel_high)
Nick Clifton 6766a3
 	{
Nick Clifton 6766a3
-	  arelent * rel = rel_pp[rel_count];
Nick Clifton 6766a3
+	  arelent ** rel_mid = &rel_low[(rel_high - rel_low) / 2];
Nick Clifton 6766a3
+	  arelent *  rel = *rel_mid;
Nick Clifton 6766a3
 
Nick Clifton 6766a3
-	  if (rel->address == vma
Nick Clifton 6766a3
-	      && rel->sym_ptr_ptr != NULL
Nick Clifton 6766a3
-	      /* Absolute relocations do not provide a more helpful symbolic address.  */
Nick Clifton 6766a3
-	      && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
Nick Clifton 6766a3
+	  if (rel->address == vma)
Nick Clifton 6766a3
 	    {
Nick Clifton 6766a3
-	      if (place != NULL)
Nick Clifton 6766a3
-		* place = thisplace;
Nick Clifton 6766a3
-	      return * rel->sym_ptr_ptr;
Nick Clifton 6766a3
+	      /* Absolute relocations do not provide a more helpful
Nick Clifton 6766a3
+	         symbolic address.  Find a non-absolute relocation
Nick Clifton 6766a3
+	         with the same address.  */
Nick Clifton 6766a3
+
Nick Clifton 6766a3
+	      arelent **rel_vma = rel_mid;
Nick Clifton 6766a3
+
Nick Clifton 6766a3
+	      for (rel_mid--;
Nick Clifton 6766a3
+		   rel_mid >= rel_low && rel_mid[0]->address == vma;
Nick Clifton 6766a3
+		   rel_mid--)
Nick Clifton 6766a3
+		rel_vma = rel_mid;
Nick Clifton 6766a3
+
Nick Clifton 6766a3
+	      for (; rel_vma <= rel_high && rel_vma[0]->address == vma;
Nick Clifton 6766a3
+		   rel_vma++)
Nick Clifton 6766a3
+		{
Nick Clifton 6766a3
+		  rel = *rel_vma;
Nick Clifton 6766a3
+		  if (rel->sym_ptr_ptr != NULL
Nick Clifton 6766a3
+		      && ! bfd_is_abs_section ((* rel->sym_ptr_ptr)->section))
Nick Clifton 6766a3
+		    {
Nick Clifton 6766a3
+		      if (place != NULL)
Nick Clifton 6766a3
+			* place = thisplace;
Nick Clifton 6766a3
+		      return * rel->sym_ptr_ptr;
Nick Clifton 6766a3
+		    }
Nick Clifton 6766a3
+		}
Nick Clifton 6766a3
+	      break;
Nick Clifton 6766a3
 	    }
Nick Clifton 6766a3
 
Nick Clifton 6766a3
-	  /* We are scanning backwards, so if we go below the target address
Nick Clifton 6766a3
-	     we have failed.  */
Nick Clifton 6766a3
-	  if (rel_pp[rel_count]->address < vma)
Nick Clifton 6766a3
+	  if (vma < rel->address)
Nick Clifton 6766a3
+	    rel_high = rel_mid;
Nick Clifton 6766a3
+	  else if (vma >= rel_mid[1]->address)
Nick Clifton 6766a3
+	    rel_low = rel_mid + 1;
Nick Clifton 6766a3
+	  else
Nick Clifton 6766a3
 	    break;
Nick Clifton 6766a3
 	}
Nick Clifton 6766a3
     }