* ld.texinfo (Forced Output Alignment): Specify that this is an
authorAlan Modra <amodra@gmail.com>
Wed, 16 Nov 2005 07:17:20 +0000 (07:17 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 16 Nov 2005 07:17:20 +0000 (07:17 +0000)
alignment increase, not an override.
* ldlang.c (init_os): Set output section alignment here..
(lang_add_section): ..rather than here.
(lang_size_sections_1): Consolidate alignment code.  Warn if section
alignment affects start address when explicit address given.

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

index ea25fd9c5db2b952cb6555dc6d40dd2eb972aa77..60ff9b387184741d258343b7eb497d94ed809099 100644 (file)
@@ -1,3 +1,12 @@
+2005-11-16  Alan Modra  <amodra@bigpond.net.au>
+
+       * ld.texinfo (Forced Output Alignment): Specify that this is an
+       alignment increase, not an override.
+       * ldlang.c (init_os): Set output section alignment here..
+       (lang_add_section): ..rather than here.
+       (lang_size_sections_1): Consolidate alignment code.  Warn if section
+       alignment affects start address when explicit address given.
+
 2005-11-07  Steve Ellcey  <sje@cup.hp.com>
 
        * configure: Regenerate after modifying bfd/warning.m4.
index 87dd20250f3cd518a1d54f688d0a0549254d8b21..c08f6927c2e6ddc7bd50e9ea3d9bbbb548b59561 100644 (file)
@@ -3775,9 +3775,7 @@ for (dst = &_bstart; dst< &_bend; dst++)
 @kindex ALIGN(@var{section_align})
 @cindex forcing output section alignment
 @cindex output section alignment
-You can force an output section alignment by using ALIGN.  The value
-specified overrides any alignment given by input sections, whether
-larger or smaller.
+You can increase an output section's alignment by using ALIGN.
 
 @node Forced Input Alignment
 @subsubsection Forced Input Alignment
index 496e9f86d62ba607ad4c68889505f2b20d386104..8ceb8ad2e0eaa3ffd335c664205c185edbcf5d9a 100644 (file)
@@ -1720,6 +1720,10 @@ init_os (lang_output_section_statement_type *s, asection *isec)
   if (s->load_base != NULL)
     exp_init_os (s->load_base);
 
+  /* If supplied an alignment, set it.  */
+  if (s->section_alignment != -1)
+    s->bfd_section->alignment_power = s->section_alignment;
+
   if (isec)
     bfd_init_private_section_data (isec->owner, isec,
                                   output_bfd, s->bfd_section,
@@ -1941,10 +1945,6 @@ lang_add_section (lang_statement_list_type *ptr,
       if (section->alignment_power > output->bfd_section->alignment_power)
        output->bfd_section->alignment_power = section->alignment_power;
 
-      /* If supplied an alignment, then force it.  */
-      if (output->section_alignment != -1)
-       output->bfd_section->alignment_power = output->section_alignment;
-
       if (bfd_get_arch (section->owner) == bfd_arch_tic54x
          && (section->flags & SEC_TIC54X_BLOCK) != 0)
        {
@@ -4144,6 +4144,8 @@ lang_size_sections_1
              }
            else
              {
+               bfd_vma savedot;
+
                if (os->addr_tree == NULL)
                  {
                    /* No address specified for this section, get one
@@ -4193,27 +4195,20 @@ lang_size_sections_1
                      }
 
                    newdot = os->region->current;
-
-                   if (os->section_alignment == -1)
-                     {
-                       bfd_vma savedot = newdot;
-                       newdot = align_power (newdot,
-                                             os->bfd_section->alignment_power);
-
-                       if (newdot != savedot
-                           && config.warn_section_align
-                           && expld.phase != lang_mark_phase_enum)
-                         einfo (_("%P: warning: changing start of section"
-                                  " %s by %lu bytes\n"),
-                                os->name, (unsigned long) (newdot - savedot));
-                     }
                  }
 
-               /* The section starts here.
-                  First, align to what the section needs.  */
+               /* Align to what the section needs.  */
+               savedot = newdot;
+               newdot = align_power (newdot,
+                                     os->bfd_section->alignment_power);
 
-               if (os->section_alignment != -1)
-                 newdot = align_power (newdot, os->section_alignment);
+               if (newdot != savedot
+                   && (config.warn_section_align
+                       || os->addr_tree != NULL)
+                   && expld.phase != lang_mark_phase_enum)
+                 einfo (_("%P: warning: changing start of section"
+                          " %s by %lu bytes\n"),
+                        os->name, (unsigned long) (newdot - savedot));
 
                bfd_set_section_vma (0, os->bfd_section, newdot);