* objdump.c (objdump_print_address): If we can't find a smaller
authorIan Lance Taylor <ian@airs.com>
Fri, 16 Sep 1994 16:33:18 +0000 (16:33 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 16 Sep 1994 16:33:18 +0000 (16:33 +0000)
symbol in the right section, look for a larger one.

binutils/ChangeLog
binutils/objdump.c

index 797acdef63f581a155476a09d4783bd93ee96e4d..634ad89591caf4af2b2f6ed07821a32b0d390678 100644 (file)
@@ -2,7 +2,8 @@ Fri Sep 16 11:27:39 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
        * objdump.c (struct objdump_disasm_info): Add field require_sec.
        (objdump_print_address): If aux->require_sec, require that the
-       symbol be in aux->sec even if HAS_RELOC is not set.
+       symbol be in aux->sec even if HAS_RELOC is not set.  If we can't
+       find a smaller symbol in the right section, look for a larger one.
        (disassemble_data): Set aux.require_sec around the
        objdump_print_address call for the instruction address.
 
index 496033f30119b257855b7a1f0e004345aa9218a4..1b5db95e4d75d0785ac9ffe78e5337d00ed77131 100644 (file)
@@ -422,12 +422,12 @@ objdump_print_address (vma, info)
     long i;
 
     aux = (struct objdump_disasm_info *) info->application_data;
-    if ((aux->require_sec
-        || (aux->abfd->flags & HAS_RELOC) != 0)
-       && vma >= bfd_get_section_vma (aux->abfd, aux->sec)
-       && vma < (bfd_get_section_vma (aux->abfd, aux->sec)
-                 + bfd_get_section_size_before_reloc (aux->sec))
-       && syms[thisplace]->section != aux->sec)
+    if (syms[thisplace]->section != aux->sec
+       && (aux->require_sec
+           || ((aux->abfd->flags & HAS_RELOC) != 0
+               && vma >= bfd_get_section_vma (aux->abfd, aux->sec)
+               && vma < (bfd_get_section_vma (aux->abfd, aux->sec)
+                         + bfd_get_section_size_before_reloc (aux->sec)))))
       {
        for (i = thisplace + 1; i < symcount; i++)
          {
@@ -443,8 +443,23 @@ objdump_print_address (vma, info)
                break;
              }
          }
+
+       if (syms[thisplace]->section != aux->sec)
+         {
+           /* We didn't find a good symbol with a smaller value.
+               Look for one with a larger value.  */
+           for (i = thisplace + 1; i < symcount; i++)
+             {
+               if (syms[i]->section == aux->sec)
+                 {
+                   thisplace = i;
+                   break;
+                 }
+             }
+         }
       }
   }
+
   fprintf (info->stream, " <%s", syms[thisplace]->name);
   if (syms[thisplace]->value > vma)
     {