diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -848,7 +848,8 @@ // and set as "ExtName = Name". If Name has the form "OtherDll.Func", // it shouldn't be a normal exported function but a forward to another // DLL instead. This is supported by both MS and GNU linkers. - if (e1.ExtName != e1.Name && StringRef(e1.Name).contains('.')) { + if (!e1.ExtName.empty() && e1.ExtName != e1.Name && + StringRef(e1.Name).contains('.')) { e2.name = saver.save(e1.ExtName); e2.forwardTo = saver.save(e1.Name); config->exports.push_back(e2); diff --git a/lld/test/COFF/export-tricky-names.s b/lld/test/COFF/export-tricky-names.s new file mode 100644 --- /dev/null +++ b/lld/test/COFF/export-tricky-names.s @@ -0,0 +1,29 @@ +# REQUIRES: x86 + +# RUN: echo -e "EXPORTS\n foo.bar" > %t.def + +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -defsym drectve=0 %s -o %t.obj +# RUN: lld-link -entry:dllmain -dll -def:%t.def %t.obj -out:%t.1.dll +# RUN: llvm-readobj --coff-exports %t.1.dll | FileCheck %s + +# RUN: lld-link -entry:dllmain -dll %t.obj -out:%t.2.dll -export:foo.bar +# RUN: llvm-readobj --coff-exports %t.2.dll | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=x86_64-windows-msvc -defsym drectve=1 %s -o %t.drectve.obj +# RUN: lld-link -entry:dllmain -dll %t.drectve.obj -out:%t.3.dll +# RUN: llvm-readobj --coff-exports %t.3.dll | FileCheck %s + +# CHECK: Name: foo.bar + + .text + .globl dllmain + .globl foo.bar +dllmain: + ret +foo.bar: + ret + +.if drectve==1 + .section .drectve + .ascii "-export:foo.bar" +.endif