From 4bf0cafb353d8856baa25968877cd84f7a3504ae Mon Sep 17 00:00:00 2001 From: Dave Korn Date: Thu, 10 Mar 2011 10:20:26 +0000 Subject: [PATCH] Fix PE-COFF bug in orphan section alignment handling. ld/ChangeLog: 2011-03-10 Dave Korn * 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 | 7 +++++++ ld/emultempl/pe.em | 9 ++++++++- ld/emultempl/pep.em | 9 ++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index bdf4b01..d3c5235 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2011-03-10 Dave Korn + + * 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 * ld.texinfo: Document --verbose[=NUMBER]. diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 9b800cd..b8290b3 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -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 '\$' diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 2119367..0c1dfb9 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -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 '\$' -- cgit v1.1