From Wally Iimura <iimura@microunity.com>:
authorIan Lance Taylor <ian@airs.com>
Mon, 9 Aug 1999 06:14:09 +0000 (06:14 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 9 Aug 1999 06:14:09 +0000 (06:14 +0000)
* ldlang.c (lang_size_sections): When checking whether an address
is within a region, don't get confused by wrapping around at the
end of the address space.

ld/ChangeLog
ld/ldlang.c

index 5d808340cad4956fe8a0828f3d462a1d6867cc84..8f68eff629f17a7a8f8e9762163f8fb5c7b470c3 100644 (file)
@@ -1,3 +1,10 @@
+1999-08-09  Ian Lance Taylor  <ian@zembu.com>
+
+       From Wally Iimura <iimura@microunity.com>:
+       * ldlang.c (lang_size_sections): When checking whether an address
+       is within a region, don't get confused by wrapping around at the
+       end of the address space.
+
 1999-08-08  Ian Lance Taylor  <ian@zembu.com>
 
        * ldlang.c (wild_doit): Update for renaming of SEC_SHORT to
index c447f6d29f38b356438a9e51bd21ecffb7eb32ac..acdd31fda1e927ec66653abbd8e86e05e5555b9c 100644 (file)
@@ -2740,14 +2740,22 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
               overall size in memory.  */
            if (os->region != (lang_memory_region_type *) NULL
                && (bfd_get_section_flags (output_bfd, os->bfd_section)
-               & (SEC_ALLOC | SEC_LOAD)))
+                   & (SEC_ALLOC | SEC_LOAD)))
              {
                os->region->current = dot;
                
-               /* Make sure this isn't silly.  */
-               if (os->region->current < os->region->origin
-                   || (os->region->current - os->region->origin
-                       > os->region->length))
+               /* Make sure the new address is within the region.  We
+                   explicitly permit the current address to be at the
+                   exact end of the region when the VMA is non-zero,
+                   in case the region is at the end of addressable
+                   memory and the calculation wraps around.  */
+               if ((os->region->current < os->region->origin
+                    || (os->region->current - os->region->origin
+                        > os->region->length))
+                   && ((os->region->current
+                        != os->region->origin + os->region->length)
+                       || os->bfd_section->vma == 0))
+
                  {
                    if (os->addr_tree != (etree_type *) NULL)
                      {