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