* NEWS: Mention LMA default change.
authorAlan Modra <amodra@gmail.com>
Tue, 22 Aug 2006 07:41:05 +0000 (07:41 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 22 Aug 2006 07:41:05 +0000 (07:41 +0000)
* ld.texinfo (Output Section LMA): Update default description.
(Location Counter): Clarify backward movement.
* ldlang.c (lang_size_sections_1): Leave non-alloc sections with
default lma equal to vma.  Warn on backward movement of dot.

ld/ChangeLog
ld/NEWS
ld/ld.texinfo
ld/ldlang.c

index cadb3f003dcad5897d61a6d9736a03b16ad2b59c..42cfec743dd49c1f65b0e872246a71e9260d718b 100644 (file)
@@ -1,3 +1,11 @@
+2006-08-22  Alan Modra  <amodra@bigpond.net.au>
+
+       * NEWS: Mention LMA default change.
+       * ld.texinfo (Output Section LMA): Update default description.
+       (Location Counter): Clarify backward movement.
+       * ldlang.c (lang_size_sections_1): Leave non-alloc sections with
+       default lma equal to vma.  Warn on backward movement of dot.
+
 2006-08-22  Pedro Alves  <pedro_alves@portugalmail.pt>
 
        * Makefile.am: Split arm-wince into its own emulation.
diff --git a/ld/NEWS b/ld/NEWS
index 4ca2e9b1ccbaba6e8c463507373f2033920d2a57..89d4cd5c4b7a5cdff24caee77e2728de70eddf0d 100644 (file)
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -1,4 +1,10 @@
 -*- text -*-
+* The default output section LMA has changed for allocatable sections from
+  being equal to VMA, to keeping the difference between LMA and VMA the same as
+  the previous output section in the same region.  This is a more useful
+  default when using overlays and other cases where you specify an LMA
+  differing from the VMA for some sections.
+
 * New switch: --print-gc-sections to list any sections removed by garabge
   collection.
 
index 835482d1c294e24609539fe441e36be78e7a9428..ea21283483d5f4f08afb3677900b74b71faca0cf 100644 (file)
@@ -3764,15 +3764,20 @@ Every section has a virtual address (VMA) and a load address (LMA); see
 an output section description sets the VMA (@pxref{Output Section
 Address}).
 
-The linker will normally set the LMA equal to the VMA.  You can change
-that by using the @code{AT} keyword.  The expression @var{lma} that
-follows the @code{AT} keyword specifies the load address of the
-section.
+The expression @var{lma} that follows the @code{AT} keyword specifies
+the load address of the section.
 
 Alternatively, with @samp{AT>@var{lma_region}} expression, you may
 specify a memory region for the section's load address. @xref{MEMORY}.
 Note that if the section has not had a VMA assigned to it then the
 linker will use the @var{lma_region} as the VMA region as well.
+
+If neither @code{AT} nor @code{AT>} is specified for an allocatable
+section, the linker will set the LMA such that the difference between
+VMA and LMA for the section is the same as the preceding output
+section in the same region.  If there is no preceding output section
+or the section is not allocatable, the linker will set the LMA equal
+to the VMA.
 @xref{Output Section Region}.
 
 @cindex ROM initialized data
@@ -4586,7 +4591,9 @@ anywhere that an ordinary symbol is allowed in an expression.
 @cindex holes
 Assigning a value to @code{.} will cause the location counter to be
 moved.  This may be used to create holes in the output section.  The
-location counter may never be moved backwards.
+location counter may not be moved backwards inside an output section,
+and may not be moved backwards outside of an output section if so
+doing creates areas with overlapping LMAs.
 
 @smallexample
 SECTIONS
index e478bd8ba26785f85dd130453ed84abefe67420d..df5c33cc258a1bb07a132fe3d4d39447ca0d8a17 100644 (file)
@@ -4400,16 +4400,30 @@ lang_size_sections_1
                  lma = align_power (lma, os->section_alignment);
                os->bfd_section->lma = lma;
              }
-           else if (r->last_os != NULL)
+           else if (r->last_os != NULL
+                    && (os->bfd_section->flags & SEC_ALLOC) != 0)
              {
                bfd_vma lma;
                asection *last;
 
                last = r->last_os->output_section_statement.bfd_section;
-               /* If dot moved backwards (which is invalid according
-                  to ld docs) then leave lma equal to vma.  This
-                  keeps users of buggy ld scripts happy.  */
-               if (dot >= last->vma)
+
+               /* A backwards move of dot should be accompanied by
+                  an explicit assignment to the section LMA (ie.
+                  os->load_base set) because backwards moves normally
+                  create overlapping LMAs.  */
+               if (dot < last->vma)
+                 {
+                   einfo (_("%P: warning: dot moved backwards before `%s'\n"),
+                          os->name);
+
+                   /* If dot moved backwards then leave lma equal to
+                      vma.  This is the old default lma, which might
+                      just happen to work when the backwards move is
+                      sufficiently large.  Nag anyway, so people fix
+                      their linker scripts.  */
+                 }
+               else
                  {
                    /* If the current vma overlaps the previous section,
                       then set the current lma to that at the end of
@@ -4440,9 +4454,16 @@ lang_size_sections_1
               lma region.  We use this to set the lma for
               following sections.  Overlays or other linker
               script assignment to lma might mean that the
-              default lma == vma is incorrect.  */
+              default lma == vma is incorrect.
+              To avoid warnings about dot moving backwards when using
+              -Ttext, don't start tracking sections until we find one
+              of non-zero size or with lma set differently to vma.  */
            if (((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0
                 || (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0)
+               && (os->bfd_section->flags & SEC_ALLOC) != 0
+               && (os->bfd_section->size != 0
+                   || os->bfd_section->vma != os->bfd_section->lma
+                   || r->last_os != NULL)
                && os->lma_region == NULL
                && !link_info.relocatable)
              r->last_os = s;