This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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}
   }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]