aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorKai Tietz <ktietz@redhat.com>2015-07-03 15:50:29 +0100
committerNick Clifton <nickc@redhat.com>2015-07-03 15:50:29 +0100
commit0f088b2a9417b1d4ed597849ffa671eba25f5051 (patch)
tree71be9adb049a632d7c572c0a8d82ad5ca8539de9 /ld
parentb6b3dd8f31c96b6f7ba26de1508c3c1b2fd437f9 (diff)
downloadbinutils-0f088b2a9417b1d4ed597849ffa671eba25f5051.zip
binutils-0f088b2a9417b1d4ed597849ffa671eba25f5051.tar.gz
binutils-0f088b2a9417b1d4ed597849ffa671eba25f5051.tar.bz2
Add experimental support for --gc-sections with COFF and PE based targets.
PR ld/11539 bfd * coffcode.h (coff_bfd_gc_sections): Define default to bfd_coff_gc_sections function. * cofflink.c (init_reloc_cookie): Copy and adjust coff related code about gc-sections from elflink.c to here. (fini_reloc_cookie): Likewise. (init_reloc_cookie_rels): Likewise. (fini_reloc_cookie_rels): Likewise. (init_reloc_cookie_for_section): Likewise. (fini_reloc_cookie_for_section): Likewise. (_bfd_coff_gc_mark_hook): Likewise. (_bfd_coff_gc_mark_rsec): Likewise. (_bfd_coff_gc_mark_reloc): Likewise. (_bfd_coff_gc_mark): Likewise. (_bfd_coff_gc_mark_extra_sections): Likewise. (coff_gc_sweep_symbol_info): Likewise. (coff_gc_sweep_symbol): Likewise. (gc_sweep_hook_fn): Likewise. (coff_gc_sweep): Likewise. (bfd_coff_gc_sections): Likewise. (_bfd_coff_gc_keep): Likewise. * libcoff.h (coff_reloc_cookie): New struct. (bfd_coff_gc_sections): New prototype. (coff_gc_mark_hook_fn): New type. ld * 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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog12
-rw-r--r--ld/NEWS3
-rw-r--r--ld/ld.texinfo4
-rw-r--r--ld/scripttempl/pe.sc44
-rw-r--r--ld/scripttempl/pep.sc60
-rw-r--r--ld/testsuite/ChangeLog7
-rw-r--r--ld/testsuite/lib/ld-lib.exp4
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.
diff --git a/ld/NEWS b/ld/NEWS
index 140d3c9..e3de432 100644
--- a/ld/NEWS
+++ b/ld/NEWS
@@ -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
}