* ldlang.c (lang_size_sections): Adjust current region address
authorIan Lance Taylor <ian@airs.com>
Wed, 22 Jun 1994 20:04:29 +0000 (20:04 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 22 Jun 1994 20:04:29 +0000 (20:04 +0000)
even for sections with an explicit address.  From
ralphc@pyramid.com (Ralph Campbell).

ld/ChangeLog
ld/ldlang.c

index 26bc3fcfc499b1c832f5d6fa3a6ea7426c8dd7c1..6c5a0f2c312dc02d2d1eb410e2ea75ac4eabf2f8 100644 (file)
@@ -1,5 +1,9 @@
 Wed Jun 22 13:42:14 1994  Ian Lance Taylor  (ian@sanguine.cygnus.com)
 
+       * ldlang.c (lang_size_sections): Adjust current region address
+       even for sections with an explicit address.  From
+       ralphc@pyramid.com (Ralph Campbell).
+
        * emulparams/i386linux.sh (NONPAGED_TEXT_START_ADDR): Set to 0.
        From jrs@world.std.com (Rick Sladkey).
 
index 36a85534b0cd3e7755f26186a6736f403a340318..8b6f6ab50afa03bd1db9601d8c98f1623395dfbf 100644 (file)
@@ -410,7 +410,7 @@ lang_init ()
                                    (char *) NULL);
   abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
 
-  abs_output_section->bfd_section = &bfd_abs_section;
+  abs_output_section->bfd_section = bfd_abs_section_ptr;
 
 }
 
@@ -1617,10 +1617,10 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
           break;
         }
 
-       if (os->bfd_section == &bfd_abs_section)
+       if (bfd_is_abs_section (os->bfd_section))
        {
         /* No matter what happens, an abs section starts at zero */
-        bfd_set_section_vma (0, os->bfd_section, 0);
+        ASSERT (os->bfd_section->vma == 0);
        }
        else
        {
@@ -1664,10 +1664,9 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
           os->bfd_section->lma 
             = exp_get_value_int(os->load_base, 0,"load base", lang_final_phase_enum);
         }
-       }
-
 
-       os->bfd_section->output_offset = 0;
+        os->bfd_section->output_offset = 0;
+       }
 
        (void) lang_size_sections (os->children.head, os, &os->children.head,
                                  os->fill, dot, relax);
@@ -1679,13 +1678,15 @@ lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
                        /* The coercion here is important, see ld.h.  */
                        (bfd_vma) os->block_value);
 
-       os->bfd_section->_raw_size = after - os->bfd_section->vma;
+       if (bfd_is_abs_section (os->bfd_section))
+        ASSERT (after == os->bfd_section->vma);
+       else
+        os->bfd_section->_raw_size = after - os->bfd_section->vma;
        dot = os->bfd_section->vma + os->bfd_section->_raw_size;
        os->processed = true;
 
        /* Replace into region ? */
-       if (os->addr_tree == (etree_type *) NULL
-          && os->region != (lang_memory_region_type *) NULL)
+       if (os->region != (lang_memory_region_type *) NULL)
        {
         os->region->current = dot;
         /* Make sure this isn't silly */
@@ -2806,7 +2807,7 @@ lang_abs_symbol_at_beginning_of (secname, name)
       else
        h->u.def.value = bfd_get_section_vma (output_bfd, sec);
 
-      h->u.def.section = &bfd_abs_section;
+      h->u.def.section = bfd_abs_section_ptr;
     }
 }
 
@@ -2841,7 +2842,7 @@ lang_abs_symbol_at_end_of (secname, name)
        h->u.def.value = (bfd_get_section_vma (output_bfd, sec)
                          + bfd_section_size (output_bfd, sec));
 
-      h->u.def.section = &bfd_abs_section;
+      h->u.def.section = bfd_abs_section_ptr;
     }
 }