Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/COFF/Driver.cpp @@ -1107,6 +1107,12 @@ 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()); Index: lld/trunk/test/COFF/ctors_dtors_priority.s =================================================================== --- lld/trunk/test/COFF/ctors_dtors_priority.s +++ lld/trunk/test/COFF/ctors_dtors_priority.s @@ -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 @@ .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