[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