[lld] r340940 - [COFF] Merge the .ctors, .dtors and .CRT sections into .rdata for MinGW

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 29 10:24:10 PDT 2018


Author: mstorsjo
Date: Wed Aug 29 10:24:10 2018
New Revision: 340940

URL: http://llvm.org/viewvc/llvm-project?rev=340940&view=rev
Log:
[COFF] Merge the .ctors, .dtors and .CRT sections into .rdata for MinGW

There's no point in keeping them as separate sections.

This differs from GNU ld, which places .ctors and .dtors content in
.text (implemented by a built-in linker script). But since the content
only is pointers, there's no need to have it executable.

GNU ld also leaves .CRT separate as its own standalone section.

MSVC merges .CRT into .rdata similarly, with a directive embedded in
an object file in msvcrt.lib or libcmt.lib.

Differential Revision: https://reviews.llvm.org/D51414

Modified:
    lld/trunk/COFF/Driver.cpp
    lld/trunk/test/COFF/ctors_dtors_priority.s

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=340940&r1=340939&r2=340940&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Wed Aug 29 10:24:10 2018
@@ -1107,6 +1107,12 @@ void LinkerDriver::link(ArrayRef<const c
   parseMerge(".xdata=.rdata");
   parseMerge(".bss=.data");
 
+  if (Config->MinGW) {
+    parseMerge(".ctors=.rdata");
+    parseMerge(".dtors=.rdata");
+    parseMerge(".CRT=.rdata");
+  }
+
   // Handle /section
   for (auto *Arg : Args.filtered(OPT_section))
     parseSection(Arg->getValue());

Modified: lld/trunk/test/COFF/ctors_dtors_priority.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/ctors_dtors_priority.s?rev=340940&r1=340939&r2=340940&view=diff
==============================================================================
--- lld/trunk/test/COFF/ctors_dtors_priority.s (original)
+++ lld/trunk/test/COFF/ctors_dtors_priority.s Wed Aug 29 10:24:10 2018
@@ -1,6 +1,6 @@
 # REQUIRES: x86
 # RUN: llvm-mc -triple=x86_64-windows-gnu -filetype=obj -o %t.obj %s
-# RUN: lld-link -entry:main %t.obj -out:%t.exe
+# RUN: lld-link -lldmingw -entry:main %t.obj -out:%t.exe
 # RUN: llvm-objdump -s %t.exe | FileCheck %s
 
 .globl main
@@ -15,16 +15,20 @@ main:
   .quad 3
 
 .section .dtors, "w"
-  .quad 1
+  .quad 4
 .section .dtors.00100, "w"
-  .quad 3
+  .quad 6
 .section .dtors.00005, "w"
-  .quad 2
+  .quad 5
+
+# Also test that the .CRT section is merged into .rdata
+
+.section .CRT$XCA, "dw"
+  .quad 7
+  .quad 8
 
-# CHECK:      Contents of section .ctors:
-# CHECK-NEXT: 140002000 01000000 00000000 02000000 00000000
-# CHECK-NEXT: 140002010 03000000 00000000
-
-# CHECK:      Contents of section .dtors:
-# CHECK-NEXT: 140003000 01000000 00000000 02000000 00000000
-# CHECK-NEXT: 140003010 03000000 00000000
+# CHECK:      Contents of section .rdata:
+# CHECK-NEXT: 140002000 07000000 00000000 08000000 00000000
+# CHECK-NEXT: 140002010 01000000 00000000 02000000 00000000
+# CHECK-NEXT: 140002020 03000000 00000000 04000000 00000000
+# CHECK-NEXT: 140002030 05000000 00000000 06000000 00000000




More information about the llvm-commits mailing list