[lld] r343879 - [COFF] Do MinGW specific entry/subsystem inference

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 5 12:43:24 PDT 2018


Author: mstorsjo
Date: Fri Oct  5 12:43:24 2018
New Revision: 343879

URL: http://llvm.org/viewvc/llvm-project?rev=343879&view=rev
Log:
[COFF] Do MinGW specific entry/subsystem inference

ld.bfd doesn't do any inference of subsystem; unless the windows
subsystem is specified, the console subsystem is used.

For the console subsystem, the entry point is called mainCRTStartup,
regardless of whether the the user code entry point is main or wmain.
The same goes for the windows subsystem, where the entry point always
is WinMainCRTStartup, for both WinMain and wWinMain in user code.

One detail that we don't emulate, is that if the inferred entry point
is undefined, ld.bfd silently just sets the entry point to the start
of the image. And if an explicit entry point is set, but it is
undefined, the link still succeeds but the linker warns about the
entry point not being found.

Differential Revision: https://reviews.llvm.org/D52931

Added:
    lld/trunk/test/COFF/entry-inference-mingw.s
    lld/trunk/test/COFF/subsystem-inference-mingw.s
Modified:
    lld/trunk/COFF/Driver.cpp

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=343879&r1=343878&r2=343879&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Fri Oct  5 12:43:24 2018
@@ -430,6 +430,11 @@ StringRef LinkerDriver::findDefaultEntry
   assert(Config->Subsystem != IMAGE_SUBSYSTEM_UNKNOWN &&
          "must handle /subsystem before calling this");
 
+  if (Config->MinGW)
+    return mangle(Config->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI
+                      ? "WinMainCRTStartup"
+                      : "mainCRTStartup");
+
   if (Config->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) {
     if (findUnderscoreMangle("wWinMain")) {
       if (!findUnderscoreMangle("WinMain"))
@@ -449,6 +454,8 @@ StringRef LinkerDriver::findDefaultEntry
 WindowsSubsystem LinkerDriver::inferSubsystem() {
   if (Config->DLL)
     return IMAGE_SUBSYSTEM_WINDOWS_GUI;
+  if (Config->MinGW)
+    return IMAGE_SUBSYSTEM_WINDOWS_CUI;
   // Note that link.exe infers the subsystem from the presence of these
   // functions even if /entry: or /nodefaultlib are passed which causes them
   // to not be called.

Added: lld/trunk/test/COFF/entry-inference-mingw.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/entry-inference-mingw.s?rev=343879&view=auto
==============================================================================
--- lld/trunk/test/COFF/entry-inference-mingw.s (added)
+++ lld/trunk/test/COFF/entry-inference-mingw.s Fri Oct  5 12:43:24 2018
@@ -0,0 +1,44 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.o
+
+# RUN: lld-link -lldmingw %t.o -out:%t-default.exe 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+# RUN: lld-link -lldmingw %t.o -out:%t-cui.exe -subsystem:console 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+# RUN: lld-link -lldmingw %t.o -out:%t-gui.exe -subsystem:windows 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+
+# RUN: llvm-readobj -file-headers %t-default.exe | FileCheck -check-prefix=CUI %s
+# RUN: llvm-readobj -file-headers %t-cui.exe | FileCheck -check-prefix=CUI %s
+# RUN: llvm-readobj -file-headers %t-gui.exe | FileCheck -check-prefix=GUI %s
+
+# Check that this doesn't print any warnings.
+# LINK-NOT: found both wmain and main
+
+# CUI: AddressOfEntryPoint: 0x1001
+# CUI: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+
+# GUI: AddressOfEntryPoint: 0x1002
+# GUI: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_GUI (0x2)
+
+
+        .text
+        .globl mainCRTStartup
+        .globl WinMainCRTStartup
+# MinGW only uses the entry points above, these other ones aren't
+# used as entry.
+        .globl main
+        .globl wmain
+        .globl wmainCRTStartup
+        .globl wWinMainCRTStartup
+foo:
+        ret
+mainCRTStartup:
+        ret
+WinMainCRTStartup:
+        ret
+main:
+        ret
+wmain:
+        ret
+wmainCRTStartup:
+        ret
+wWinMainCRTStartup:
+        ret

Added: lld/trunk/test/COFF/subsystem-inference-mingw.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/subsystem-inference-mingw.s?rev=343879&view=auto
==============================================================================
--- lld/trunk/test/COFF/subsystem-inference-mingw.s (added)
+++ lld/trunk/test/COFF/subsystem-inference-mingw.s Fri Oct  5 12:43:24 2018
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.o
+
+# RUN: lld-link -lldmingw %t.o -out:%t.exe
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: AddressOfEntryPoint: 0x1001
+# CHECK: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+
+        .text
+        .globl foo
+        .globl mainCRTStartup
+foo:
+        ret
+mainCRTStartup:
+        call foo
+        ret




More information about the llvm-commits mailing list