]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/scripttempl/pe.sc
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / scripttempl / pe.sc
index 6cf59eafcc3bfcf244122736a16997f10e6d8225..4617c05ff0cad1bd7ce7f1c353ce0ab9faf5fb3b 100644 (file)
@@ -1,4 +1,10 @@
 # Linker script for PE.
+#
+# Copyright (C) 2014-2021 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
 
 if test -z "${RELOCATEABLE_OUTPUT_FORMAT}"; then
   RELOCATEABLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
@@ -15,49 +21,38 @@ if test "${RELOCATING}"; then
   R_TEXT='*(SORT(.text$*))'
   if test "x$LD_FLAG" = "xauto_import" ; then
     R_DATA='*(SORT(.data$*))
-            *(.rdata)
+           *(.rdata)
            *(SORT(.rdata$*))'
     R_RDATA=''
   else
     R_DATA='*(SORT(.data$*))'
     R_RDATA='*(.rdata)
-             *(SORT(.rdata$*))'
+            *(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)'
-  if test -z "$DEFAULT_MANIFEST"; then
-    R_RSRC='
-      *(.rsrc)
-      *(SORT(.rsrc$*))'
-  else
-    R_RSRC="
-      /* The default manifest contains information necessary for
-         binaries to run under Windows 8 (or later).  It is included as
-         the last resource file so that if the application has provided
-         its own manifest then that one will take precedence.  */
-      *(EXCLUDE_FILE ($DEFAULT_MANIFEST) .rsrc)
-      *(SORT(.rsrc*))
-      KEEP ($DEFAULT_MANIFEST(.rsrc))"
-  fi
+    KEEP (*(.tls$AAA))
+    KEEP (*(.tls))
+    KEEP (*(.tls$))
+    KEEP (*(SORT(.tls$*)))
+    KEEP (*(.tls$ZZZ))'
+  R_RSRC='
+    KEEP (*(.rsrc))
+    KEEP (*(.rsrc$*))'
 else
   R_TEXT=
   R_DATA=
@@ -65,11 +60,22 @@ else
   R_IDATA234=
   R_IDATA5=
   R_IDATA67=
-  R_CRT=
+  R_CRT_XC=
+  R_CRT_XI=
+  R_CRT_XL=
+  R_CRT_XP=
+  R_CRT_XT=
+  R_TLS='*(.tls)'
   R_RSRC='*(.rsrc)'
 fi
 
 cat <<EOF
+/* Copyright (C) 2014-2021 Free Software Foundation, Inc.
+
+   Copying and distribution of this script, with or without modification,
+   are permitted in any medium without royalty provided the copyright
+   notice and this notice are preserved.  */
+
 ${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
 ${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
 ${OUTPUT_ARCH+OUTPUT_ARCH(${OUTPUT_ARCH})}
@@ -84,23 +90,58 @@ SECTIONS
   ${RELOCATING+. = ALIGN(__section_alignment__);}
   .text ${RELOCATING+ __image_base__ + ( __section_alignment__ < ${TARGET_PAGE_SIZE} ? . : __section_alignment__ )} :
   {
-    ${RELOCATING+ *(.init)}
+    ${RELOCATING+KEEP (*(SORT_NONE(.init)))}
     *(.text)
     ${R_TEXT}
     ${RELOCATING+ *(.text.*)}
     ${RELOCATING+ *(.gnu.linkonce.t.*)}
-    *(.glue_7t)
-    *(.glue_7)
-    ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
-                       LONG (-1);*(.ctors); *(.ctor); *(SORT(.ctors.*));  LONG (0); }
-    ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
-                       LONG (-1); *(.dtors); *(.dtor); *(SORT(.dtors.*));  LONG (0); }
-    ${RELOCATING+ *(.fini)}
-    /* ??? Why is .gcc_exc here?  */
+    ${RELOCATING+*(.glue_7t)}
+    ${RELOCATING+*(.glue_7)}
+    ${CONSTRUCTING+
+       /* Note: we always define __CTOR_LIST__ and ___CTOR_LIST__ here,
+          we do not PROVIDE them.  This is because the ctors.o startup
+         code in libgcc defines them as common symbols, with the 
+          expectation that they will be overridden by the definitions
+         here.  If we PROVIDE the symbols then they will not be
+         overridden and global constructors will not be run.
+         See PR 22762 for more details.
+         
+         This does mean that it is not possible for a user to define
+         their own __CTOR_LIST__ and __DTOR_LIST__ symbols; if they do,
+         the content from those variables are included but the symbols
+         defined here silently take precedence.  If they truly need to
+         be redefined, a custom linker script will have to be used.
+         (The custom script can just be a copy of this script with the
+         PROVIDE() qualifiers added).
+
+         In particular this means that ld -Ur does not work, because
+         the proper __CTOR_LIST__ set by ld -Ur is overridden by a
+         bogus __CTOR_LIST__ set by the final link.  See PR 46.  */
+       ___CTOR_LIST__ = .;
+       __CTOR_LIST__ = .;
+       LONG (-1);
+       KEEP(*(.ctors));
+       KEEP(*(.ctor));
+       KEEP(*(SORT_BY_NAME(.ctors.*)));
+       LONG (0);
+     }
+    ${CONSTRUCTING+
+       /* See comment about __CTOR_LIST__ above.  The same reasoning
+          applies here too.  */
+       ___DTOR_LIST__ = .;
+       __DTOR_LIST__ = .;
+       LONG (-1);
+       KEEP(*(.dtors));
+       KEEP(*(.dtor));
+       KEEP(*(SORT_BY_NAME(.dtors.*)));
+       LONG (0);
+     }
+    ${RELOCATING+KEEP (*(SORT_NONE(.fini)))}
+    ${RELOCATING+/* ??? Why is .gcc_exc here?  */}
     ${RELOCATING+ *(.gcc_exc)}
     ${RELOCATING+PROVIDE (etext = .);}
     ${RELOCATING+PROVIDE (_etext = .);}
-    ${RELOCATING+ *(.gcc_except_table)}
+    ${RELOCATING+ KEEP (*(.gcc_except_table))}
   }
 
   /* The Cygwin32 library uses a section to avoid copying certain data
@@ -113,9 +154,9 @@ SECTIONS
   {
     ${RELOCATING+__data_start__ = . ;}
     *(.data)
-    *(.data2)
+    ${RELOCATING+*(.data2)}
     ${R_DATA}
-    *(.jcr)
+    KEEP(*(.jcr))
     ${RELOCATING+__data_end__ = . ;}
     ${RELOCATING+*(.data_cygwin_nocopy)}
   }
@@ -123,8 +164,9 @@ SECTIONS
   .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
   {
     ${R_RDATA}
+    . = ALIGN(4);
     ${RELOCATING+__rt_psrelocs_start = .;}
-    *(.rdata_runtime_pseudo_reloc)
+    ${RELOCATING+KEEP(*(.rdata_runtime_pseudo_reloc))}
     ${RELOCATING+__rt_psrelocs_end = .;}
   }
   ${RELOCATING+__rt_psrelocs_size = __rt_psrelocs_end - __rt_psrelocs_start;}
@@ -135,12 +177,12 @@ SECTIONS
 
   .eh_frame ${RELOCATING+BLOCK(__section_alignment__)} :
   {
-    *(.eh_frame*)
+    KEEP(*(.eh_frame${RELOCATING+*}))
   }
 
   .pdata ${RELOCATING+BLOCK(__section_alignment__)} :
   {
-    *(.pdata)
+    KEEP(*(.pdata${RELOCATING+*}))
   }
 
   .bss ${RELOCATING+BLOCK(__section_alignment__)} :
@@ -177,7 +219,7 @@ SECTIONS
     ${R_IDATA67}
   }
   .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
-  {                                    
+  {
     ${RELOCATING+___crt_xc_start__ = . ;}
     ${R_CRT_XC}
     ${RELOCATING+___crt_xc_end__ = . ;}
@@ -200,7 +242,7 @@ SECTIONS
      be at the beginning of the section to enable SECREL32 relocations with TLS
      data.  */
   .tls ${RELOCATING+BLOCK(__section_alignment__)} :
-  {                                    
+  {
     ${RELOCATING+___tls_start__ = . ;}
     ${R_TLS}
     ${RELOCATING+___tls_end__ = . ;}
@@ -214,7 +256,7 @@ SECTIONS
     ${RELOCATING+ __end__ = .;}
   }
 
-  .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
+  .rsrc ${RELOCATING+BLOCK(__section_alignment__)} : SUBALIGN(4)
   {
     ${R_RSRC}
   }
@@ -396,5 +438,15 @@ SECTIONS
   {
     *(.zdebug_types${RELOCATING+ .gnu.linkonce.wt.*})
   }
+
+  /* For Go and Rust.  */
+  .debug_gdb_scripts ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
+  {
+    *(.debug_gdb_scripts)
+  }
+  .zdebug_gdb_scripts ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
+  {
+    *(.zdebug_gdb_scripts)
+  }
 }
 EOF