2012-02-10 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Fri, 10 Feb 2012 10:09:14 +0000 (10:09 +0000)
committerTristan Gingold <gingold@adacore.com>
Fri, 10 Feb 2012 10:09:14 +0000 (10:09 +0000)
* elfnn-ia64.c (elfNN_vms_object_p): Change comparison operator
to avoid infinite loop.  Add comments.

bfd/ChangeLog
bfd/elfnn-ia64.c

index d85c9f5..c6e3159 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-10  Tristan Gingold  <gingold@adacore.com>
+
+       * elfnn-ia64.c (elfNN_vms_object_p): Change comparison operator
+       to avoid infinite loop.  Add comments.
+
 2012-02-09  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/13675
index 3e2ee0b..d70b28e 100644 (file)
@@ -5036,18 +5036,27 @@ elfNN_vms_object_p (bfd *abfd)
          flagword flags;
          char *nname = NULL;
 
-         /* Find a section covering base_vma.  */
+         /* Find a section covering [base_vma;limit_vma)  */
          for (sec = abfd->sections; sec != NULL; sec = sec->next)
            {
-             if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0)
+             /* Skip uninteresting sections (either not in memory or
+                below base_vma.  */
+             if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0
+                 || sec->vma + sec->size <= base_vma)
                continue;
-             if (sec->vma <= base_vma && sec->vma + sec->size > base_vma)
+             if (sec->vma <= base_vma)
                {
+                 /* This section covers (maybe partially) the beginning
+                    of the range.  */
                  base_vma = sec->vma + sec->size;
                  goto again;
                }
-             if (sec->vma < next_vma && sec->vma + sec->size >= base_vma)
-               next_vma = sec->vma;
+             if (sec->vma < next_vma)
+               {
+                 /* This section partially covers the end of the range.
+                    Used to compute the size of the hole.  */
+                 next_vma = sec->vma;
+               }
            }
 
          /* No section covering [base_vma; next_vma).  Create a fake one.  */