From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17237 invoked by alias); 13 Aug 2012 12:37:29 -0000 Received: (qmail 17024 invoked by uid 22791); 13 Aug 2012 12:37:26 -0000 X-SWARE-Spam-Status: No, hits=-4.0 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,KHOP_RCVD_TRUST,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-wg0-f41.google.com (HELO mail-wg0-f41.google.com) (74.125.82.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 13 Aug 2012 12:37:11 +0000 Received: by wgbds1 with SMTP id ds1so2799377wgb.0 for ; Mon, 13 Aug 2012 05:37:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.180.78.170 with SMTP id c10mr18268964wix.3.1344861429451; Mon, 13 Aug 2012 05:37:09 -0700 (PDT) Received: by 10.216.28.79 with HTTP; Mon, 13 Aug 2012 05:37:09 -0700 (PDT) Date: Mon, 13 Aug 2012 12:42:00 -0000 Message-ID: Subject: [patch ld]: Fix for bug ld/11539: ld --gc-sections should work for PE-COFF on MinGW From: Kai Tietz To: Binutils Cc: Nick Clifton Content-Type: text/plain; charset=ISO-8859-1 X-IsSubscribed: yes Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2012-08/txt/msg00217.txt.bz2 Hello, This patch addresses for pe-coff and pe+-coff the issue reported about --gc-sections. ChangeLog 2012-08-13 Kai Tietz * 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} }