OSDN Git Service

[PATCH] Fix PE-COFF bug in orphan section alignment handling.
authordavek <davek>
Thu, 10 Mar 2011 19:20:26 +0000 (19:20 +0000)
committerdavek <davek>
Thu, 10 Mar 2011 19:20:26 +0000 (19:20 +0000)
ld/ChangeLog:

2011-03-10  Dave Korn  <dave.korn.cygwin@gmail.com>

* emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Preserve
alignment of input sections when creating orphan output sections
during relocatable link.
* emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.

ld/ChangeLog
ld/emultempl/pe.em
ld/emultempl/pep.em

index bdf4b01..d3c5235 100644 (file)
@@ -1,3 +1,10 @@
+2011-03-10  Dave Korn  <dave.korn.cygwin@gmail.com>
+
+       * emultempl/pe.em (gld_${EMULATION_NAME}_place_orphan): Preserve
+       alignment of input sections when creating orphan output sections
+       during relocatable link.
+       * emultempl/pep.em (gld_${EMULATION_NAME}_place_orphan): Likewise.
+
 2011-03-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ld.texinfo: Document --verbose[=NUMBER].
index 9b800cd..b8290b3 100644 (file)
@@ -2009,10 +2009,17 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
                     ->output_section_statement);
        }
 
-      /* All sections in an executable must be aligned to a page boundary.  */
+      /* All sections in an executable must be aligned to a page boundary.
+        In a relocatable link, just preserve the incoming alignment; the
+        address is discarded by lang_insert_orphan in that case, anyway.  */
       address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
       os = lang_insert_orphan (s, secname, constraint, after, place, address,
                               &add_child);
+      if (link_info.relocatable)
+       {
+         os->section_alignment = s->alignment_power;
+         os->bfd_section->alignment_power = s->alignment_power;
+       }
     }
 
   /* If the section name has a '\$', sort it with the other '\$'
index 2119367..0c1dfb9 100644 (file)
@@ -1748,10 +1748,17 @@ gld_${EMULATION_NAME}_place_orphan (asection *s,
                     ->output_section_statement);
        }
 
-      /* All sections in an executable must be aligned to a page boundary.  */
+      /* All sections in an executable must be aligned to a page boundary.
+        In a relocatable link, just preserve the incoming alignment; the
+        address is discarded by lang_insert_orphan in that case, anyway.  */
       address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
       os = lang_insert_orphan (s, secname, constraint, after, place, address,
                               &add_child);
+      if (link_info.relocatable)
+       {
+         os->section_alignment = s->alignment_power;
+         os->bfd_section->alignment_power = s->alignment_power;
+       }
     }
 
   /* If the section name has a '\$', sort it with the other '\$'