diff options
author | Nico Weber <nicolasweber@gmx.de> | 2018-08-22 16:47:16 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2018-08-22 16:47:16 +0000 |
commit | ebc27c487378385058440d3eae9d1bf9ee7b40d6 (patch) | |
tree | bf0b8d28d2e5b5b9ec6da1dc88562954f61dcc9e | |
parent | 7bd9dcffcdf33b190151cd5979e9578822cf78ab (diff) | |
download | llvm-ebc27c487378385058440d3eae9d1bf9ee7b40d6.zip llvm-ebc27c487378385058440d3eae9d1bf9ee7b40d6.tar.gz llvm-ebc27c487378385058440d3eae9d1bf9ee7b40d6.tar.bz2 |
lld-link: Emit warning if one each of {main,wmain} and {WinMain,wWinMain} exist and no /subsystem: flag is passed.
Similar to link.exe's LNK4031.
https://reviews.llvm.org/D51076
llvm-svn: 340420
-rw-r--r-- | lld/COFF/Driver.cpp | 14 | ||||
-rw-r--r-- | lld/test/COFF/subsystem-inference2.test | 54 |
2 files changed, 66 insertions, 2 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index c21f0b4..02cff8f 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -449,9 +449,19 @@ StringRef LinkerDriver::findDefaultEntry() { WindowsSubsystem LinkerDriver::inferSubsystem() { if (Config->DLL) return IMAGE_SUBSYSTEM_WINDOWS_GUI; - if (findUnderscoreMangle("main") || findUnderscoreMangle("wmain")) + bool HaveMain = findUnderscoreMangle("main"); + bool HaveWMain = findUnderscoreMangle("wmain"); + bool HaveWinMain = findUnderscoreMangle("WinMain"); + bool HaveWWinMain = findUnderscoreMangle("wWinMain"); + if (HaveMain || HaveWMain) { + if (HaveWinMain || HaveWWinMain) { + warn(std::string("found ") + (HaveMain ? "main" : "wmain") + " and " + + (HaveWinMain ? "WinMain" : "wWinMain") + + "; defaulting to /subsystem:console"); + } return IMAGE_SUBSYSTEM_WINDOWS_CUI; - if (findUnderscoreMangle("WinMain") || findUnderscoreMangle("wWinMain")) + } + if (HaveWinMain || HaveWWinMain) return IMAGE_SUBSYSTEM_WINDOWS_GUI; return IMAGE_SUBSYSTEM_UNKNOWN; } diff --git a/lld/test/COFF/subsystem-inference2.test b/lld/test/COFF/subsystem-inference2.test new file mode 100644 index 0000000..0c159a7 --- /dev/null +++ b/lld/test/COFF/subsystem-inference2.test @@ -0,0 +1,54 @@ +# RUN: yaml2obj %s > %t.obj +# RUN: lld-link /out:%t.exe %t.obj 2>&1 | FileCheck -check-prefix=WARN %s +# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s + +# WARN: warning: found main and WinMain; defaulting to /subsystem:console +# CHECK: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [] +sections: + - Name: .text + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] + Alignment: 4 + SectionData: B82A000000C3 +symbols: + - Name: .text + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 6 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 + - Name: main + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: WinMain + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: mainCRTStartup + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: WinMainCRTStartup + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL +... |