This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[patch ld]: Fix for bug ld/11539: ld --gc-sections should work for PE-COFF on MinGW
- From: Kai Tietz <ktietz70 at googlemail dot com>
- To: Binutils <binutils at sourceware dot org>
- Cc: Nick Clifton <nickc at redhat dot com>
- Date: Mon, 13 Aug 2012 14:37:09 +0200
- Subject: [patch ld]: Fix for bug ld/11539: ld --gc-sections should work for PE-COFF on MinGW
Hello,
This patch addresses for pe-coff and pe+-coff the issue reported about
--gc-sections.
ChangeLog
2012-08-13 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.
Tested for i686-w64-mingw32, and for x86_64-w64-mingw32. Ok for apply?
Regards,
Kai
Index: src/ld/scripttempl/pe.sc
===================================================================
--- src.orig/ld/scripttempl/pe.sc
+++ src/ld/scripttempl/pe.sc
@@ -24,27 +24,27 @@ 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)'
- R_RSRC='*(SORT(.rsrc$*))'
+ KEEP(*(.tls$AAA))
+ KEEP(*(.tls))
+ KEEP(*(.tls$))
+ KEEP(*(SORT(.tls$*)))
+ KEEP(*(.tls$ZZZ))'
+ R_RSRC='KEEP(*(SORT(.rsrc$*)))'
else
R_TEXT=
R_DATA=
@@ -71,7 +71,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.*)}
@@ -79,14 +79,16 @@ SECTIONS
*(.glue_7t)
*(.glue_7)
${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
- LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*)); LONG (0); }
+ LONG (-1);KEEP(*(.ctors)); KEEP(*(.ctor));
+ KEEP(*(SORT(.ctors.*))); LONG (0); }
${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
- LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*)); LONG (0); }
- ${RELOCATING+ *(.fini)}
+ LONG (-1); KEEP(*(.dtors)); KEEP(*(.dtor));
+ KEEP(*(SORT(.dtors.*))); 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
@@ -101,7 +103,7 @@ SECTIONS
*(.data)
*(.data2)
${R_DATA}
- *(.jcr)
+ KEEP(*(.jcr))
${RELOCATING+__data_end__ = . ;}
${RELOCATING+*(.data_cygwin_nocopy)}
}
@@ -121,12 +123,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__)} :
@@ -202,7 +204,7 @@ SECTIONS
.rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.rsrc)
+ KEEP(*(.rsrc))
${R_RSRC}
}
Index: src/ld/scripttempl/pep.sc
===================================================================
--- src.orig/ld/scripttempl/pep.sc
+++ src/ld/scripttempl/pep.sc
@@ -24,27 +24,27 @@ 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)'
- R_RSRC='*(SORT(.rsrc$*))'
+ KEEP(*(.tls$AAA))
+ KEEP(*(.tls))
+ KEEP(*(.tls$))
+ KEEP(*(SORT(.tls$*)))
+ KEEP(*(.tls$ZZZ))'
+ R_RSRC='KEEP(*(SORT(.rsrc$*)))'
else
R_TEXT=
R_DATA=
@@ -71,7 +71,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.*)}
@@ -80,14 +80,18 @@ 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
@@ -102,7 +106,7 @@ SECTIONS
*(.data)
*(.data2)
${R_DATA}
- *(.jcr)
+ KEEP(*(.jcr))
${RELOCATING+__data_end__ = . ;}
${RELOCATING+*(.data_cygwin_nocopy)}
}
@@ -127,12 +131,12 @@ SECTIONS
.pdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.pdata*)
+ KEEP(*(.pdata*))
}
.xdata ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.xdata*)
+ KEEP(*(.xdata*))
}
.bss ${RELOCATING+BLOCK(__section_alignment__)} :
@@ -208,7 +212,7 @@ SECTIONS
.rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
{
- *(.rsrc)
+ KEEP(*(.rsrc))
${R_RSRC}
}