diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 12 | ||||
-rw-r--r-- | ld/NEWS | 3 | ||||
-rw-r--r-- | ld/ld.texinfo | 4 | ||||
-rw-r--r-- | ld/scripttempl/pe.sc | 44 | ||||
-rw-r--r-- | ld/scripttempl/pep.sc | 60 | ||||
-rw-r--r-- | ld/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | ld/testsuite/lib/ld-lib.exp | 4 |
7 files changed, 82 insertions, 52 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 7324717..9228ead 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,15 @@ +2015-07-03 Kai Tietz <ktietz@redhat.com> + + PR ld/11539 + * scripttempl/pep.sc: Mark .idata*, .CRT*, .tls*, + .rsrc*, .init, .ctor*, .dtor*, .fini, .jcr, + .eh_frame, .pdata. .xdata, and .gcc_except_table sections + as KEEP. + * scripttempl/pe.sc: Likewise. + * ld.texinfo: Document that --gc-sections has experimental support + for COFF and PE targets. + * NEWS: Mention experimental support. + 2015-07-03 Alan Modra <amodra@gmail.com> * Makefile.am (eelf32or1k.c, eelf32or1k_linux.c): Depend on ELF_DEPS. @@ -1,5 +1,8 @@ -*- text -*- +* Experimental support for linker garbage collection (--gc-sections) + has been enabled for COFF and PE based targets. + * New command line option for ELF targets to compress DWARF debug sections, --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi]. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index e12b64a..246f545 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1436,7 +1436,9 @@ it ends in a @code{.exe} suffix. Enable garbage collection of unused input sections. It is ignored on targets that do not support this option. The default behaviour (of not performing this garbage collection) can be restored by specifying -@samp{--no-gc-sections} on the command line. +@samp{--no-gc-sections} on the command line. Note that garbage +collection for COFF and PE format targets is supported, but the +implementation is currently considered to be experimental. @samp{--gc-sections} decides which input sections are used by examining symbols and relocations. The section containing the entry diff --git a/ld/scripttempl/pe.sc b/ld/scripttempl/pe.sc index fbc38e8..0adc78b 100644 --- a/ld/scripttempl/pe.sc +++ b/ld/scripttempl/pe.sc @@ -30,29 +30,29 @@ if test "${RELOCATING}"; then *(SORT(.rdata$*))' fi R_IDATA234=' - SORT(*)(.idata$2) - SORT(*)(.idata$3) + KEEP (SORT(*)(.idata$2)) + KEEP (SORT(*)(.idata$3)) /* These zeroes mark the end of the import list. */ LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); - SORT(*)(.idata$4)' - R_IDATA5='SORT(*)(.idata$5)' + KEEP (SORT(*)(.idata$4))' + R_IDATA5='KEEP (SORT(*)(.idata$5))' R_IDATA67=' - SORT(*)(.idata$6) - SORT(*)(.idata$7)' - R_CRT_XC='*(SORT(.CRT$XC*)) /* C initialization */' - R_CRT_XI='*(SORT(.CRT$XI*)) /* C++ initialization */' - R_CRT_XL='*(SORT(.CRT$XL*)) /* TLS callbacks */' - R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */' - R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */' + KEEP (SORT(*)(.idata$6)) + KEEP (SORT(*)(.idata$7))' + R_CRT_XC='KEEP (*(SORT(.CRT$XC*))) /* C initialization */' + R_CRT_XI='KEEP (*(SORT(.CRT$XI*))) /* C++ initialization */' + R_CRT_XL='KEEP (*(SORT(.CRT$XL*))) /* TLS callbacks */' + R_CRT_XP='KEEP (*(SORT(.CRT$XP*))) /* Pre-termination */' + R_CRT_XT='KEEP (*(SORT(.CRT$XT*))) /* Termination */' R_TLS=' - *(.tls$AAA) - *(.tls) - *(.tls$) - *(SORT(.tls$*)) - *(.tls$ZZZ)' + KEEP (*(.tls$AAA)) + KEEP (*(.tls)) + KEEP (*(.tls$)) + KEEP (*(SORT(.tls$*))) + KEEP (*(.tls$ZZZ))' R_RSRC=' - *(.rsrc) - *(.rsrc$*)' + KEEP (*(.rsrc)) + KEEP (*(.rsrc$*))' else R_TEXT= R_DATA= @@ -85,7 +85,7 @@ SECTIONS ${RELOCATING+. = ALIGN(__section_alignment__);} .text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} : { - ${RELOCATING+ *(.init)} + ${RELOCATING+ KEEP(*(.init))} *(.text) ${R_TEXT} ${RELOCATING+ *(.text.*)} @@ -116,7 +116,7 @@ SECTIONS *(.data) *(.data2) ${R_DATA} - *(.jcr) + KEEP(*(.jcr)) ${RELOCATING+__data_end__ = . ;} ${RELOCATING+*(.data_cygwin_nocopy)} } @@ -136,12 +136,12 @@ SECTIONS .eh_frame ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.eh_frame*) + KEEP(*(.eh_frame*)) } .pdata ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.pdata) + KEEP(*(.pdata)) } .bss ${RELOCATING+BLOCK(__section_alignment__)} : diff --git a/ld/scripttempl/pep.sc b/ld/scripttempl/pep.sc index 50b4104..6e78b21 100644 --- a/ld/scripttempl/pep.sc +++ b/ld/scripttempl/pep.sc @@ -30,29 +30,29 @@ if test "${RELOCATING}"; then *(SORT(.rdata$*))' fi R_IDATA234=' - SORT(*)(.idata$2) - SORT(*)(.idata$3) + KEEP (SORT(*)(.idata$2)) + KEEP (SORT(*)(.idata$3)) /* These zeroes mark the end of the import list. */ LONG (0); LONG (0); LONG (0); LONG (0); LONG (0); - SORT(*)(.idata$4)' + KEEP (SORT(*)(.idata$4))' R_IDATA5='SORT(*)(.idata$5)' R_IDATA67=' - SORT(*)(.idata$6) - SORT(*)(.idata$7)' - R_CRT_XC='*(SORT(.CRT$XC*)) /* C initialization */' - R_CRT_XI='*(SORT(.CRT$XI*)) /* C++ initialization */' - R_CRT_XL='*(SORT(.CRT$XL*)) /* TLS callbacks */' - R_CRT_XP='*(SORT(.CRT$XP*)) /* Pre-termination */' - R_CRT_XT='*(SORT(.CRT$XT*)) /* Termination */' + KEEP (SORT(*)(.idata$6)) + KEEP (SORT(*)(.idata$7))' + R_CRT_XC='KEEP (*(SORT(.CRT$XC*))) /* C initialization */' + R_CRT_XI='KEEP (*(SORT(.CRT$XI*))) /* C++ initialization */' + R_CRT_XL='KEEP (*(SORT(.CRT$XL*))) /* TLS callbacks */' + R_CRT_XP='KEEP (*(SORT(.CRT$XP*))) /* Pre-termination */' + R_CRT_XT='KEEP (*(SORT(.CRT$XT*))) /* Termination */' R_TLS=' - *(.tls$AAA) - *(.tls) - *(.tls$) - *(SORT(.tls$*)) - *(.tls$ZZZ)' + KEEP (*(.tls$AAA)) + KEEP (*(.tls)) + KEEP (*(.tls$)) + KEEP (*(SORT(.tls$*))) + KEEP (*(.tls$ZZZ))' R_RSRC=' - *(.rsrc) - *(.rsrc$*)' + KEEP (*(.rsrc)) + KEEP (*(.rsrc$*))' else R_TEXT= R_DATA= @@ -85,7 +85,7 @@ SECTIONS ${RELOCATING+. = ALIGN(__section_alignment__);} .text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} : { - ${RELOCATING+ *(.init)} + ${RELOCATING+ KEEP(*(.init))} *(.text) ${R_TEXT} ${RELOCATING+ *(.text.*)} @@ -94,14 +94,22 @@ SECTIONS *(.glue_7) ${CONSTRUCTING+. = ALIGN(8);} ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; - LONG (-1); LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); LONG (0); } + LONG (-1); LONG (-1); + KEEP (*(.ctors)); + KEEP (*(.ctor)); + KEEP (*(SORT(.ctors.*))); + LONG (0); LONG (0); } ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; - LONG (-1); LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); LONG (0); } - ${RELOCATING+ *(.fini)} + LONG (-1); LONG (-1); + KEEP (*(.dtors)); + KEEP (*(.dtor)); + KEEP (*(SORT(.dtors.*))); + LONG (0); LONG (0); } + ${RELOCATING+ KEEP (*(.fini))} /* ??? Why is .gcc_exc here? */ ${RELOCATING+ *(.gcc_exc)} ${RELOCATING+PROVIDE (etext = .);} - ${RELOCATING+ *(.gcc_except_table)} + ${RELOCATING+ KEEP (*(.gcc_except_table))} } /* The Cygwin32 library uses a section to avoid copying certain data @@ -116,7 +124,7 @@ SECTIONS *(.data) *(.data2) ${R_DATA} - *(.jcr) + KEEP(*(.jcr)) ${RELOCATING+__data_end__ = . ;} ${RELOCATING+*(.data_cygwin_nocopy)} } @@ -136,17 +144,17 @@ SECTIONS .eh_frame ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.eh_frame*) + KEEP (*(.eh_frame*)) } .pdata ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.pdata*) + KEEP(*(.pdata*)) } .xdata ${RELOCATING+BLOCK(__section_alignment__)} : { - *(.xdata*) + KEEP(*(.xdata*)) } .bss ${RELOCATING+BLOCK(__section_alignment__)} : diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 0e611b9..03fff18 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2015-07-03 Kai Tietz <ktietz@redhat.com> + Nick Clifton <nickc@redhat.com> + + PR ld/11539 + * lib/ld-lib.exp (check_gc_sections_available): Do not + automatically fail for cygwin and mingw targets. + 2015-07-01 Sandra Loosemore <sandra@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com> diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 9e22706..0cab4d3 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -1610,9 +1610,7 @@ proc check_gc_sections_available { } { || [istarget i860-*-*] || [istarget ia64-*-*] || [istarget mep-*-*] - || [istarget mn10200-*-*] - || [istarget *-*-cygwin] - || [istarget *-*-mingw*] } { + || [istarget mn10200-*-*] } { set gc_sections_available_saved 0 return 0 } |