diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -1078,6 +1078,10 @@ edataStart = edataSec->chunks.front(); edataEnd = edataSec->chunks.back(); } + // Warn on exported deleting destructor. + for (auto e : config->exports) + if (e.sym->getName().startswith("??_G")) + warn("export of deleting dtor: " + toString(*e.sym)); } void Writer::removeUnusedSections() { diff --git a/lld/test/COFF/export-deleting-dtor.s b/lld/test/COFF/export-deleting-dtor.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/export-deleting-dtor.s @@ -0,0 +1,26 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -triple=x86_64-windows-msvc -defsym drectve=0 %s -filetype=obj -o %t.obj +# RUN: echo -e "EXPORTS\n ??_G?\$Foo@H@@UEAAPEAXI@Z" > %t.def + +# RUN: lld-link %t.obj -entry:dllmain -dll -export:'??_G?$Foo@H@@UEAAPEAXI@Z' -out:%t.1.dll 2>&1 | FileCheck %s + +# RUN: lld-link %t.obj -entry:dllmain -dll -def:%t.def -out:%t.2.dll 2>&1 | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -defsym drectve=1 %s -o %t.drectve.obj +# RUN: lld-link %t.drectve.obj -entry:dllmain -dll -out:%t.3.dll 2>&1 | FileCheck %s + +# CHECK: export of deleting destructor: + + .text + .globl dllmain + .globl "??_G?$Foo@H@@UEAAPEAXI@Z" +dllmain: + ret +"??_G?$Foo@H@@UEAAPEAXI@Z": + ret + +.if drectve==1 + .section .drectve + .ascii "-export:??_G?$Foo@H@@UEAAPEAXI@Z" +.endif