return;
}
- // In MinGW, all symbols are automatically exported if no symbols
- // are chosen to be exported.
- if (Config->DLL && ((Config->MinGW && Config->Exports.empty()) ||
- Args.hasArg(OPT_export_all_symbols))) {
+ // In MinGW, if no symbols are chosen to be exported, then all symbols are
+ // automatically exported by default. This behavior can be forced by the
+ // -export-all-symbols option, so that it happens even when exports are
+ // explicitly specified. The automatic behavior can be disabled using the
+ // -exclude-all-symbols option, so that lld-link behaves like link.exe rather
+ // than MinGW in the case that nothing is explicitly exported.
+ if (Config->MinGW && Config->DLL &&
+ ((Config->Exports.empty() && !Args.hasArg(OPT_exclude_all_symbols)) ||
+ Args.hasArg(OPT_export_all_symbols))) {
Exporter.initSymbolExcludes();
Symtab->forEachSymbol([=](Symbol *S) {
def help_q : Flag<["/?", "-?"], "">, Alias<help>;
// LLD extensions
+def exclude_all_symbols : F<"exclude-all-symbols">;
def export_all_symbols : F<"export-all-symbols">;
def kill_at : F<"kill-at">;
def lldmingw : F<"lldmingw">;
--- /dev/null
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=i686-windows-gnu %s -filetype=obj -o %t.obj
+
+# RUN: lld-link -lldmingw -exclude-all-symbols -dll -out:%t.dll -entry:DllMainCRTStartup@12 %t.obj
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck %s -check-prefix=NO-EXPORTS
+
+# NO-EXPORTS-NOT: Name:
+
+.global _foobar
+.global _DllMainCRTStartup@12
+.global _dataSym
+.text
+_DllMainCRTStartup@12:
+ ret
+_foobar:
+ ret
+.data
+_dataSym:
+ .int 4
+
+# Test specifying -exclude-all-symbols, on an object file that contains
+# dllexport directive for some of the symbols. In this case, the dllexported
+# symbols are still exported.
+
+# RUN: yaml2obj < %p/Inputs/export.yaml > %t.obj
+#
+# RUN: lld-link -out:%t.dll -dll %t.obj -lldmingw -exclude-all-symbols -output-def:%t.def
+# RUN: llvm-readobj -coff-exports %t.dll | FileCheck -check-prefix=DLLEXPORT %s
+
+# DLLEXPORT: Name: exportfn3