xref: /llvm-project-15.0.7/lld/COFF/Driver.cpp (revision 8692a4d1)
1 //===- Driver.cpp ---------------------------------------------------------===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "Config.h"
11 #include "Driver.h"
12 #include "Error.h"
13 #include "InputFiles.h"
14 #include "SymbolTable.h"
15 #include "Writer.h"
16 #include "llvm/ADT/Optional.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/LibDriver/LibDriver.h"
20 #include "llvm/Option/Arg.h"
21 #include "llvm/Option/ArgList.h"
22 #include "llvm/Option/Option.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/Path.h"
26 #include "llvm/Support/Process.h"
27 #include "llvm/Support/TargetSelect.h"
28 #include "llvm/Support/raw_ostream.h"
29 #include <algorithm>
30 #include <memory>
31 
32 using namespace llvm;
33 using namespace llvm::COFF;
34 using llvm::sys::Process;
35 using llvm::sys::fs::OpenFlags;
36 using llvm::sys::fs::file_magic;
37 using llvm::sys::fs::identify_magic;
38 
39 namespace lld {
40 namespace coff {
41 
42 Configuration *Config;
43 LinkerDriver *Driver;
44 
45 bool link(llvm::ArrayRef<const char *> Args) {
46   auto C = make_unique<Configuration>();
47   Config = C.get();
48   auto D = make_unique<LinkerDriver>();
49   Driver = D.get();
50   return Driver->link(Args);
51 }
52 
53 // Drop directory components and replace extension with ".exe".
54 static std::string getOutputPath(StringRef Path) {
55   auto P = Path.find_last_of("\\/");
56   StringRef S = (P == StringRef::npos) ? Path : Path.substr(P + 1);
57   return (S.substr(0, S.rfind('.')) + ".exe").str();
58 }
59 
60 // Opens a file. Path has to be resolved already.
61 // Newly created memory buffers are owned by this driver.
62 ErrorOr<MemoryBufferRef> LinkerDriver::openFile(StringRef Path) {
63   auto MBOrErr = MemoryBuffer::getFile(Path);
64   if (auto EC = MBOrErr.getError())
65     return EC;
66   std::unique_ptr<MemoryBuffer> MB = std::move(MBOrErr.get());
67   MemoryBufferRef MBRef = MB->getMemBufferRef();
68   OwningMBs.push_back(std::move(MB)); // take ownership
69   return MBRef;
70 }
71 
72 static std::unique_ptr<InputFile> createFile(MemoryBufferRef MB) {
73   // File type is detected by contents, not by file extension.
74   file_magic Magic = identify_magic(MB.getBuffer());
75   if (Magic == file_magic::archive)
76     return std::unique_ptr<InputFile>(new ArchiveFile(MB));
77   if (Magic == file_magic::bitcode)
78     return std::unique_ptr<InputFile>(new BitcodeFile(MB));
79   if (Config->OutputFile == "")
80     Config->OutputFile = getOutputPath(MB.getBufferIdentifier());
81   return std::unique_ptr<InputFile>(new ObjectFile(MB));
82 }
83 
84 // Parses .drectve section contents and returns a list of files
85 // specified by /defaultlib.
86 std::error_code
87 LinkerDriver::parseDirectives(StringRef S) {
88   auto ArgsOrErr = Parser.parse(S);
89   if (auto EC = ArgsOrErr.getError())
90     return EC;
91   llvm::opt::InputArgList Args = std::move(ArgsOrErr.get());
92 
93   for (auto *Arg : Args) {
94     switch (Arg->getOption().getID()) {
95     case OPT_alternatename:
96       if (auto EC = parseAlternateName(Arg->getValue()))
97         return EC;
98       break;
99     case OPT_defaultlib:
100       if (Optional<StringRef> Path = findLib(Arg->getValue())) {
101         ErrorOr<MemoryBufferRef> MBOrErr = openFile(*Path);
102         if (auto EC = MBOrErr.getError())
103           return EC;
104         Symtab.addFile(createFile(MBOrErr.get()));
105       }
106       break;
107     case OPT_export: {
108       ErrorOr<Export> E = parseExport(Arg->getValue());
109       if (auto EC = E.getError())
110         return EC;
111       if (!Config->is64() && E->ExtName.startswith("_"))
112         E->ExtName = E->ExtName.substr(1);
113       Config->Exports.push_back(E.get());
114       break;
115     }
116     case OPT_failifmismatch:
117       if (auto EC = checkFailIfMismatch(Arg->getValue()))
118         return EC;
119       break;
120     case OPT_incl:
121       addUndefined(Arg->getValue());
122       break;
123     case OPT_merge:
124       if (auto EC = parseMerge(Arg->getValue()))
125         return EC;
126       break;
127     case OPT_nodefaultlib:
128       Config->NoDefaultLibs.insert(doFindLib(Arg->getValue()));
129       break;
130     default:
131       llvm::errs() << Arg->getSpelling() << " is not allowed in .drectve\n";
132       return make_error_code(LLDError::InvalidOption);
133     }
134   }
135   return std::error_code();
136 }
137 
138 // Find file from search paths. You can omit ".obj", this function takes
139 // care of that. Note that the returned path is not guaranteed to exist.
140 StringRef LinkerDriver::doFindFile(StringRef Filename) {
141   bool hasPathSep = (Filename.find_first_of("/\\") != StringRef::npos);
142   if (hasPathSep)
143     return Filename;
144   bool hasExt = (Filename.find('.') != StringRef::npos);
145   for (StringRef Dir : SearchPaths) {
146     SmallString<128> Path = Dir;
147     llvm::sys::path::append(Path, Filename);
148     if (llvm::sys::fs::exists(Path.str()))
149       return Alloc.save(Path.str());
150     if (!hasExt) {
151       Path.append(".obj");
152       if (llvm::sys::fs::exists(Path.str()))
153         return Alloc.save(Path.str());
154     }
155   }
156   return Filename;
157 }
158 
159 // Resolves a file path. This never returns the same path
160 // (in that case, it returns None).
161 Optional<StringRef> LinkerDriver::findFile(StringRef Filename) {
162   StringRef Path = doFindFile(Filename);
163   bool Seen = !VisitedFiles.insert(Path.lower()).second;
164   if (Seen)
165     return None;
166   return Path;
167 }
168 
169 // Find library file from search path.
170 StringRef LinkerDriver::doFindLib(StringRef Filename) {
171   // Add ".lib" to Filename if that has no file extension.
172   bool hasExt = (Filename.find('.') != StringRef::npos);
173   if (!hasExt)
174     Filename = Alloc.save(Filename + ".lib");
175   return doFindFile(Filename);
176 }
177 
178 // Resolves a library path. /nodefaultlib options are taken into
179 // consideration. This never returns the same path (in that case,
180 // it returns None).
181 Optional<StringRef> LinkerDriver::findLib(StringRef Filename) {
182   if (Config->NoDefaultLibAll)
183     return None;
184   StringRef Path = doFindLib(Filename);
185   if (Config->NoDefaultLibs.count(Path))
186     return None;
187   bool Seen = !VisitedFiles.insert(Path.lower()).second;
188   if (Seen)
189     return None;
190   return Path;
191 }
192 
193 // Parses LIB environment which contains a list of search paths.
194 void LinkerDriver::addLibSearchPaths() {
195   Optional<std::string> EnvOpt = Process::GetEnv("LIB");
196   if (!EnvOpt.hasValue())
197     return;
198   StringRef Env = Alloc.save(*EnvOpt);
199   while (!Env.empty()) {
200     StringRef Path;
201     std::tie(Path, Env) = Env.split(';');
202     SearchPaths.push_back(Path);
203   }
204 }
205 
206 Undefined *LinkerDriver::addUndefined(StringRef Name) {
207   Undefined *U = Symtab.addUndefined(Name);
208   Config->GCRoot.insert(U);
209   return U;
210 }
211 
212 // Symbol names are mangled by appending "_" prefix on x86.
213 StringRef LinkerDriver::mangle(StringRef Sym) {
214   assert(Config->MachineType != IMAGE_FILE_MACHINE_UNKNOWN);
215   if (Config->MachineType == IMAGE_FILE_MACHINE_I386)
216     return Alloc.save("_" + Sym);
217   return Sym;
218 }
219 
220 // Windows specific -- find default entry point name.
221 StringRef LinkerDriver::findDefaultEntry() {
222   // User-defined main functions and their corresponding entry points.
223   static const char *Entries[][2] = {
224       {"main", "mainCRTStartup"},
225       {"wmain", "wmainCRTStartup"},
226       {"WinMain", "WinMainCRTStartup"},
227       {"wWinMain", "wWinMainCRTStartup"},
228   };
229   for (auto E : Entries) {
230     Symbol *Sym = Symtab.find(mangle(E[0]));
231     if (Sym && !isa<Undefined>(Sym->Body))
232       return mangle(E[1]);
233   }
234   return "";
235 }
236 
237 WindowsSubsystem LinkerDriver::inferSubsystem() {
238   if (Config->DLL)
239     return IMAGE_SUBSYSTEM_WINDOWS_GUI;
240   if (Symtab.find(mangle("main")) || Symtab.find(mangle("wmain")))
241     return IMAGE_SUBSYSTEM_WINDOWS_CUI;
242   if (Symtab.find(mangle("WinMain")) || Symtab.find(mangle("wWinMain")))
243     return IMAGE_SUBSYSTEM_WINDOWS_GUI;
244   return IMAGE_SUBSYSTEM_UNKNOWN;
245 }
246 
247 bool LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
248   // Needed for LTO.
249   llvm::InitializeAllTargetInfos();
250   llvm::InitializeAllTargets();
251   llvm::InitializeAllTargetMCs();
252   llvm::InitializeAllAsmParsers();
253   llvm::InitializeAllAsmPrinters();
254   llvm::InitializeAllDisassemblers();
255 
256   // If the first command line argument is "/lib", link.exe acts like lib.exe.
257   // We call our own implementation of lib.exe that understands bitcode files.
258   if (ArgsArr.size() > 1 && StringRef(ArgsArr[1]).equals_lower("/lib"))
259     return llvm::libDriverMain(ArgsArr.slice(1)) == 0;
260 
261   // Parse command line options.
262   auto ArgsOrErr = Parser.parseLINK(ArgsArr.slice(1));
263   if (auto EC = ArgsOrErr.getError()) {
264     llvm::errs() << EC.message() << "\n";
265     return false;
266   }
267   llvm::opt::InputArgList Args = std::move(ArgsOrErr.get());
268 
269   // Handle /help
270   if (Args.hasArg(OPT_help)) {
271     printHelp(ArgsArr[0]);
272     return true;
273   }
274 
275   if (Args.filtered_begin(OPT_INPUT) == Args.filtered_end()) {
276     llvm::errs() << "no input files.\n";
277     return false;
278   }
279 
280   // Construct search path list.
281   SearchPaths.push_back("");
282   for (auto *Arg : Args.filtered(OPT_libpath))
283     SearchPaths.push_back(Arg->getValue());
284   addLibSearchPaths();
285 
286   // Handle /out
287   if (auto *Arg = Args.getLastArg(OPT_out))
288     Config->OutputFile = Arg->getValue();
289 
290   // Handle /verbose
291   if (Args.hasArg(OPT_verbose))
292     Config->Verbose = true;
293 
294   // Handle /force or /force:unresolved
295   if (Args.hasArg(OPT_force) || Args.hasArg(OPT_force_unresolved))
296     Config->Force = true;
297 
298   // Handle /debug
299   if (Args.hasArg(OPT_debug))
300     Config->Debug = true;
301 
302   // Handle /noentry
303   if (Args.hasArg(OPT_noentry)) {
304     if (!Args.hasArg(OPT_dll)) {
305       llvm::errs() << "/noentry must be specified with /dll\n";
306       return false;
307     }
308     Config->NoEntry = true;
309   }
310 
311   // Handle /dll
312   if (Args.hasArg(OPT_dll)) {
313     Config->DLL = true;
314     Config->ImageBase = 0x180000000U;
315     Config->ManifestID = 2;
316   }
317 
318   // Handle /fixed
319   if (Args.hasArg(OPT_fixed)) {
320     if (Args.hasArg(OPT_dynamicbase)) {
321       llvm::errs() << "/fixed must not be specified with /dynamicbase\n";
322       return false;
323     }
324     Config->Relocatable = false;
325     Config->DynamicBase = false;
326   }
327 
328   // Handle /machine
329   if (auto *Arg = Args.getLastArg(OPT_machine)) {
330     ErrorOr<MachineTypes> MTOrErr = getMachineType(Arg->getValue());
331     if (MTOrErr.getError())
332       return false;
333     Config->MachineType = MTOrErr.get();
334   }
335 
336   // Handle /nodefaultlib:<filename>
337   for (auto *Arg : Args.filtered(OPT_nodefaultlib))
338     Config->NoDefaultLibs.insert(doFindLib(Arg->getValue()));
339 
340   // Handle /nodefaultlib
341   if (Args.hasArg(OPT_nodefaultlib_all))
342     Config->NoDefaultLibAll = true;
343 
344   // Handle /base
345   if (auto *Arg = Args.getLastArg(OPT_base)) {
346     if (auto EC = parseNumbers(Arg->getValue(), &Config->ImageBase)) {
347       llvm::errs() << "/base: " << EC.message() << "\n";
348       return false;
349     }
350   }
351 
352   // Handle /stack
353   if (auto *Arg = Args.getLastArg(OPT_stack)) {
354     if (auto EC = parseNumbers(Arg->getValue(), &Config->StackReserve,
355                                &Config->StackCommit)) {
356       llvm::errs() << "/stack: " << EC.message() << "\n";
357       return false;
358     }
359   }
360 
361   // Handle /heap
362   if (auto *Arg = Args.getLastArg(OPT_heap)) {
363     if (auto EC = parseNumbers(Arg->getValue(), &Config->HeapReserve,
364                                &Config->HeapCommit)) {
365       llvm::errs() << "/heap: " << EC.message() << "\n";
366       return false;
367     }
368   }
369 
370   // Handle /version
371   if (auto *Arg = Args.getLastArg(OPT_version)) {
372     if (auto EC = parseVersion(Arg->getValue(), &Config->MajorImageVersion,
373                                &Config->MinorImageVersion)) {
374       llvm::errs() << "/version: " << EC.message() << "\n";
375       return false;
376     }
377   }
378 
379   // Handle /subsystem
380   if (auto *Arg = Args.getLastArg(OPT_subsystem)) {
381     if (auto EC = parseSubsystem(Arg->getValue(), &Config->Subsystem,
382                                  &Config->MajorOSVersion,
383                                  &Config->MinorOSVersion)) {
384       llvm::errs() << "/subsystem: " << EC.message() << "\n";
385       return false;
386     }
387   }
388 
389   // Handle /alternatename
390   for (auto *Arg : Args.filtered(OPT_alternatename))
391     if (parseAlternateName(Arg->getValue()))
392       return false;
393 
394   // Handle /include
395   for (auto *Arg : Args.filtered(OPT_incl))
396     addUndefined(Arg->getValue());
397 
398   // Handle /implib
399   if (auto *Arg = Args.getLastArg(OPT_implib))
400     Config->Implib = Arg->getValue();
401 
402   // Handle /opt
403   for (auto *Arg : Args.filtered(OPT_opt)) {
404     std::string S = StringRef(Arg->getValue()).lower();
405     if (S == "noref") {
406       Config->DoGC = false;
407       continue;
408     }
409     if (S == "lldicf") {
410       Config->ICF = true;
411       continue;
412     }
413     if (S != "ref" && S != "icf" && S != "noicf" &&
414         S != "lbr" && S != "nolbr" &&
415         !StringRef(S).startswith("icf=")) {
416       llvm::errs() << "/opt: unknown option: " << S << "\n";
417       return false;
418     }
419   }
420 
421   // Handle /delayload
422   for (auto *Arg : Args.filtered(OPT_delayload)) {
423     Config->DelayLoads.insert(StringRef(Arg->getValue()).lower());
424     addUndefined("__delayLoadHelper2");
425   }
426 
427   // Handle /failifmismatch
428   for (auto *Arg : Args.filtered(OPT_failifmismatch))
429     if (checkFailIfMismatch(Arg->getValue()))
430       return false;
431 
432   // Handle /merge
433   for (auto *Arg : Args.filtered(OPT_merge))
434     if (parseMerge(Arg->getValue()))
435       return false;
436 
437   // Handle /manifest
438   if (auto *Arg = Args.getLastArg(OPT_manifest_colon)) {
439     if (auto EC = parseManifest(Arg->getValue())) {
440       llvm::errs() << "/manifest: " << EC.message() << "\n";
441       return false;
442     }
443   }
444 
445   // Handle /manifestuac
446   if (auto *Arg = Args.getLastArg(OPT_manifestuac)) {
447     if (auto EC = parseManifestUAC(Arg->getValue())) {
448       llvm::errs() << "/manifestuac: " << EC.message() << "\n";
449       return false;
450     }
451   }
452 
453   // Handle /manifestdependency
454   if (auto *Arg = Args.getLastArg(OPT_manifestdependency))
455     Config->ManifestDependency = Arg->getValue();
456 
457   // Handle /manifestfile
458   if (auto *Arg = Args.getLastArg(OPT_manifestfile))
459     Config->ManifestFile = Arg->getValue();
460 
461   // Handle miscellaneous boolean flags.
462   if (Args.hasArg(OPT_allowbind_no))
463     Config->AllowBind = false;
464   if (Args.hasArg(OPT_allowisolation_no))
465     Config->AllowIsolation = false;
466   if (Args.hasArg(OPT_dynamicbase_no))
467     Config->DynamicBase = false;
468   if (Args.hasArg(OPT_highentropyva_no))
469     Config->HighEntropyVA = false;
470   if (Args.hasArg(OPT_nxcompat_no))
471     Config->NxCompat = false;
472   if (Args.hasArg(OPT_tsaware_no))
473     Config->TerminalServerAware = false;
474 
475   // Create a list of input files. Files can be given as arguments
476   // for /defaultlib option.
477   std::vector<StringRef> Paths;
478   std::vector<MemoryBufferRef> MBs;
479   for (auto *Arg : Args.filtered(OPT_INPUT))
480     if (Optional<StringRef> Path = findFile(Arg->getValue()))
481       Paths.push_back(*Path);
482   for (auto *Arg : Args.filtered(OPT_defaultlib))
483     if (Optional<StringRef> Path = findLib(Arg->getValue()))
484       Paths.push_back(*Path);
485   for (StringRef Path : Paths) {
486     ErrorOr<MemoryBufferRef> MBOrErr = openFile(Path);
487     if (auto EC = MBOrErr.getError()) {
488       llvm::errs() << "cannot open " << Path << ": " << EC.message() << "\n";
489       return false;
490     }
491     MBs.push_back(MBOrErr.get());
492   }
493 
494   // Windows specific -- Create a resource file containing a manifest file.
495   if (Config->Manifest == Configuration::Embed) {
496     auto MBOrErr = createManifestRes();
497     if (MBOrErr.getError())
498       return false;
499     std::unique_ptr<MemoryBuffer> MB = std::move(MBOrErr.get());
500     MBs.push_back(MB->getMemBufferRef());
501     OwningMBs.push_back(std::move(MB)); // take ownership
502   }
503 
504   // Windows specific -- Input files can be Windows resource files (.res files).
505   // We invoke cvtres.exe to convert resource files to a regular COFF file
506   // then link the result file normally.
507   std::vector<MemoryBufferRef> Resources;
508   auto NotResource = [](MemoryBufferRef MB) {
509     return identify_magic(MB.getBuffer()) != file_magic::windows_resource;
510   };
511   auto It = std::stable_partition(MBs.begin(), MBs.end(), NotResource);
512   if (It != MBs.end()) {
513     Resources.insert(Resources.end(), It, MBs.end());
514     MBs.erase(It, MBs.end());
515   }
516 
517   // Read all input files given via the command line. Note that step()
518   // doesn't read files that are specified by directive sections.
519   for (MemoryBufferRef MB : MBs)
520     Symtab.addFile(createFile(MB));
521   if (auto EC = Symtab.step()) {
522     llvm::errs() << EC.message() << "\n";
523     return false;
524   }
525 
526   // Determine machine type and check if all object files are
527   // for the same CPU type. Note that this needs to be done before
528   // any call to mangle().
529   for (std::unique_ptr<InputFile> &File : Symtab.getFiles()) {
530     MachineTypes MT = File->getMachineType();
531     if (MT == IMAGE_FILE_MACHINE_UNKNOWN)
532       continue;
533     if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) {
534       Config->MachineType = MT;
535       continue;
536     }
537     if (Config->MachineType != MT) {
538       llvm::errs() << File->getShortName() << ": machine type "
539                    << machineTypeToStr(MT) << " conflicts with "
540                    << machineTypeToStr(Config->MachineType) << "\n";
541       return false;
542     }
543   }
544   if (Config->MachineType == IMAGE_FILE_MACHINE_UNKNOWN) {
545     llvm::errs() << "warning: /machine is not specified. x64 is assumed.\n";
546     Config->MachineType = IMAGE_FILE_MACHINE_AMD64;
547   }
548 
549   // Windows specific -- Convert Windows resource files to a COFF file.
550   if (!Resources.empty()) {
551     auto MBOrErr = convertResToCOFF(Resources);
552     if (MBOrErr.getError())
553       return false;
554     std::unique_ptr<MemoryBuffer> MB = std::move(MBOrErr.get());
555     Symtab.addFile(createFile(MB->getMemBufferRef()));
556     OwningMBs.push_back(std::move(MB)); // take ownership
557   }
558 
559   // Handle /entry and /dll
560   if (auto *Arg = Args.getLastArg(OPT_entry)) {
561     Config->Entry = addUndefined(mangle(Arg->getValue()));
562   } else if (Args.hasArg(OPT_dll) && !Config->NoEntry) {
563     StringRef S =
564         Config->is64() ? "_DllMainCRTStartup" : "__DllMainCRTStartup@12";
565     Config->Entry = addUndefined(S);
566   } else if (!Config->NoEntry) {
567     // Windows specific -- If entry point name is not given, we need to
568     // infer that from user-defined entry name.
569     StringRef S = findDefaultEntry();
570     if (S.empty()) {
571       llvm::errs() << "entry point must be defined\n";
572       return false;
573     }
574     Config->Entry = addUndefined(S);
575     if (Config->Verbose)
576       llvm::outs() << "Entry name inferred: " << S << "\n";
577   }
578 
579   // Handle /export
580   for (auto *Arg : Args.filtered(OPT_export)) {
581     ErrorOr<Export> E = parseExport(Arg->getValue());
582     if (E.getError())
583       return false;
584     if (!Config->is64() && !E->Name.startswith("_@?"))
585       E->Name = mangle(E->Name);
586     Config->Exports.push_back(E.get());
587   }
588 
589   // Handle /def
590   if (auto *Arg = Args.getLastArg(OPT_deffile)) {
591     ErrorOr<MemoryBufferRef> MBOrErr = openFile(Arg->getValue());
592     if (auto EC = MBOrErr.getError()) {
593       llvm::errs() << "/def: " << EC.message() << "\n";
594       return false;
595     }
596     // parseModuleDefs mutates Config object.
597     if (parseModuleDefs(MBOrErr.get(), &Alloc))
598       return false;
599   }
600 
601   Symtab.addAbsolute(mangle("__ImageBase"), Config->ImageBase);
602 
603   // Read as much files as we can from directives sections.
604   if (auto EC = Symtab.run()) {
605     llvm::errs() << EC.message() << "\n";
606     return false;
607   }
608 
609   // Resolve auxiliary symbols until we get a convergence.
610   // (Trying to resolve a symbol may trigger a Lazy symbol to load a new file.
611   // A new file may contain a directive section to add new command line options.
612   // That's why we have to repeat until converge.)
613   for (;;) {
614     // Windows specific -- if entry point is not found,
615     // search for its mangled names.
616     if (Config->Entry)
617       Symtab.mangleMaybe(Config->Entry);
618 
619     // Windows specific -- Make sure we resolve all dllexported symbols.
620     for (Export &E : Config->Exports) {
621       E.Sym = addUndefined(E.Name);
622       Symtab.mangleMaybe(E.Sym);
623     }
624 
625     // Add weak aliases. Weak aliases is a mechanism to give remaining
626     // undefined symbols final chance to be resolved successfully.
627     for (auto Pair : Config->AlternateNames) {
628       StringRef From = Pair.first;
629       StringRef To = Pair.second;
630       Symbol *Sym = Symtab.find(From);
631       if (!Sym)
632         continue;
633       if (auto *U = dyn_cast<Undefined>(Sym->Body))
634         if (!U->WeakAlias)
635           U->WeakAlias = Symtab.addUndefined(To);
636     }
637 
638     if (Symtab.queueEmpty())
639       break;
640     if (auto EC = Symtab.run()) {
641       llvm::errs() << EC.message() << "\n";
642       return false;
643     }
644   }
645 
646   // Do LTO by compiling bitcode input files to a native COFF file
647   // then link that file.
648   if (auto EC = Symtab.addCombinedLTOObject()) {
649     llvm::errs() << EC.message() << "\n";
650     return false;
651   }
652 
653   // Make sure we have resolved all symbols.
654   if (Symtab.reportRemainingUndefines(/*Resolve=*/true))
655     return false;
656 
657   // Windows specific -- if no /subsystem is given, we need to infer
658   // that from entry point name.
659   if (Config->Subsystem == IMAGE_SUBSYSTEM_UNKNOWN) {
660     Config->Subsystem = inferSubsystem();
661     if (Config->Subsystem == IMAGE_SUBSYSTEM_UNKNOWN) {
662       llvm::errs() << "subsystem must be defined\n";
663       return false;
664     }
665   }
666 
667   // Windows specific -- when we are creating a .dll file, we also
668   // need to create a .lib file.
669   if (!Config->Exports.empty())
670     writeImportLibrary();
671 
672   // Windows specific -- fix up dllexported symbols.
673   if (!Config->Exports.empty())
674     if (fixupExports())
675       return false;
676 
677   // Windows specific -- Create a side-by-side manifest file.
678   if (Config->Manifest == Configuration::SideBySide)
679     if (createSideBySideManifest())
680       return false;
681 
682   // Create a dummy PDB file to satisfy build sytem rules.
683   if (auto *Arg = Args.getLastArg(OPT_pdb))
684     touchFile(Arg->getValue());
685 
686   // Write the result.
687   Writer Out(&Symtab);
688   if (auto EC = Out.write(Config->OutputFile)) {
689     llvm::errs() << EC.message() << "\n";
690     return false;
691   }
692 
693   // Create a symbol map file containing symbol VAs and their names
694   // to help debugging.
695   if (auto *Arg = Args.getLastArg(OPT_lldmap)) {
696     std::error_code EC;
697     llvm::raw_fd_ostream Out(Arg->getValue(), EC, OpenFlags::F_Text);
698     if (EC) {
699       llvm::errs() << EC.message() << "\n";
700       return false;
701     }
702     Symtab.printMap(Out);
703   }
704   // Call exit to avoid calling destructors.
705   exit(0);
706 }
707 
708 } // namespace coff
709 } // namespace lld
710