From 9dbc4b09afd4427c2def829f0c8283f732e654a0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20Storsj=C3=B6?= Date: Sun, 18 Jul 2021 22:52:32 +0300 Subject: [PATCH] [LLD] [COFF] Make -export-all-symbols work as intended for EXEs If some symbols are marked with dllexport, we still want to export all symbols if -export-all-symbols is specified. Previously, this only worked as it should for DLL output, not for EXE. This should fix downstream bug https://github.com/msys2/MINGW-packages/issues/9163. Differential Revision: https://reviews.llvm.org/D106245 --- lld/COFF/Driver.cpp | 6 +++--- lld/test/COFF/export-all.s | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 8e1292f..9ba0db3 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1203,10 +1203,10 @@ void LinkerDriver::convertResources() { // -exclude-all-symbols option, so that lld-link behaves like link.exe rather // than MinGW in the case that nothing is explicitly exported. void LinkerDriver::maybeExportMinGWSymbols(const opt::InputArgList &args) { - if (!config->dll) - return; - if (!args.hasArg(OPT_export_all_symbols)) { + if (!config->dll) + return; + if (!config->exports.empty()) return; if (args.hasArg(OPT_exclude_all_symbols)) diff --git a/lld/test/COFF/export-all.s b/lld/test/COFF/export-all.s index 079d0a2..b370dbe 100644 --- a/lld/test/COFF/export-all.s +++ b/lld/test/COFF/export-all.s @@ -61,6 +61,10 @@ __imp__unexported: # RUN: llvm-readobj --coff-exports %t.dll | FileCheck -check-prefix=CHECK2 %s # RUN: cat %t.def | FileCheck -check-prefix=CHECK2-DEF %s +# RUN: lld-link -safeseh:no -out:%t.exe %t.obj -lldmingw -export-all-symbols -output-def:%t.def -entry:_DllMainCRTStartup +# RUN: llvm-readobj --coff-exports %t.exe | FileCheck -check-prefix=CHECK2 %s +# RUN: cat %t.def | FileCheck -check-prefix=CHECK2-DEF %s + # Note, this will actually export _DllMainCRTStartup as well, since # it uses the standard spelling in this object file, not the MinGW one. -- 2.7.4