mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 03:56:42 +00:00

Three related changes: 1. link.exe uses the presence of main and wmain to decide if it should call mainCRTStartup or wmainCRTStartup, even if /nodefaultlib is passed. For compatibility, remove FindMain logic. 2. Default to the non-wide entrypoint if main is not found. This has two effects: 2a. In normal links, lld-link now prints lld-link: error: undefined symbol: _main >>> referenced by f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:78 >>> libcmt.lib(exe_main.obj):("int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)) >>> referenced by f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:283 >>> libcmt.lib(exe_main.obj):("int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ)) instead of lld-link: error: entry point must be defined This is arguably a better error message, since it now mentions that _main is missing. (This matches link.exe's diagnostic in this case.) 2b. With /nodefautlib, we now default to mainCRTStartup if no main() is present, again matching link.exe. This makes r337407 obsolete. This means if you have a cc file containing both mainCRTStartup and wmainCRTStartup and you pass /nodefaultlib /subsystem:console, lld-link will now call mainCRTStartup, matching link.exe 3. Print a warning if both main and wmain are present, similar to link.exe's LNK4067. Differential Revision: https://reviews.llvm.org/D52832 llvm-svn: 343698
69 lines
2.7 KiB
Plaintext
69 lines
2.7 KiB
Plaintext
# RUN: sed 's/ENTRY1/WinMain/;s/ENTRY2/main/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /subsystem:windows /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=WINMAIN %s < %t.log
|
|
|
|
# RUN: sed 's/ENTRY1/wWinMain/;s/ENTRY2/main/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /subsystem:windows /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=WWINMAIN %s < %t.log
|
|
|
|
# RUN: sed 's/ENTRY1/WinMain/;s/ENTRY2/main/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /subsystem:console /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=MAIN %s < %t.log
|
|
|
|
# RUN: sed 's/ENTRY1/WinMain/;s/ENTRY2/wmain/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /subsystem:console /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=WMAIN %s < %t.log
|
|
|
|
# RUN: sed 's/ENTRY1/wmain/;s/ENTRY2/main/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=MAINWMAIN %s < %t.log
|
|
|
|
# RUN: sed 's/ENTRY1/wWinMain/;s/ENTRY2/WinMain/' %s | yaml2obj > %t.obj
|
|
# RUN: not lld-link /out:%t.exe %t.obj > %t.log 2>&1
|
|
# RUN: FileCheck -check-prefix=WINMAINWWINMAIN %s < %t.log
|
|
|
|
# MAIN: error: <root>: undefined symbol: mainCRTStartup
|
|
# WMAIN: error: <root>: undefined symbol: wmainCRTStartup
|
|
# MAINWMAIN: warning: found both wmain and main; using latter
|
|
# MAINWMAIN: error: <root>: undefined symbol: mainCRTStartup
|
|
# WINMAIN: error: <root>: undefined symbol: WinMainCRTStartup
|
|
# WWINMAIN: error: <root>: undefined symbol: wWinMainCRTStartup
|
|
# WINMAINWWINMAIN: warning: found both wWinMain and WinMain; using latter
|
|
# WINMAINWWINMAIN: error: <root>: undefined symbol: WinMainCRTStartup
|
|
|
|
--- !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: ENTRY1
|
|
Value: 0
|
|
SectionNumber: 1
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
|
- Name: ENTRY2
|
|
Value: 0
|
|
SectionNumber: 1
|
|
SimpleType: IMAGE_SYM_TYPE_NULL
|
|
ComplexType: IMAGE_SYM_DTYPE_NULL
|
|
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
|
|
...
|