1 //===- Driver.cpp ---------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // The driver drives the entire linking process. It is responsible for
10 // parsing command line options and doing whatever it is instructed to do.
11 //
12 // One notable thing in the LLD's driver when compared to other linkers is
13 // that the LLD's driver is agnostic on the host operating system.
14 // Other linkers usually have implicit default values (such as a dynamic
15 // linker path or library paths) for each host OS.
16 //
17 // I don't think implicit default values are useful because they are
18 // usually explicitly specified by the compiler ctx.driver. They can even
19 // be harmful when you are doing cross-linking. Therefore, in LLD, we
20 // simply trust the compiler driver to pass all required options and
21 // don't try to make effort on our side.
22 //
23 //===----------------------------------------------------------------------===//
24 
25 #include "Driver.h"
26 #include "Config.h"
27 #include "ICF.h"
28 #include "InputFiles.h"
29 #include "InputSection.h"
30 #include "LTO.h"
31 #include "LinkerScript.h"
32 #include "MarkLive.h"
33 #include "OutputSections.h"
34 #include "ScriptParser.h"
35 #include "SymbolTable.h"
36 #include "Symbols.h"
37 #include "SyntheticSections.h"
38 #include "Target.h"
39 #include "Writer.h"
40 #include "lld/Common/Args.h"
41 #include "lld/Common/CommonLinkerContext.h"
42 #include "lld/Common/Driver.h"
43 #include "lld/Common/ErrorHandler.h"
44 #include "lld/Common/Filesystem.h"
45 #include "lld/Common/Memory.h"
46 #include "lld/Common/Strings.h"
47 #include "lld/Common/TargetOptionsCommandFlags.h"
48 #include "lld/Common/Version.h"
49 #include "llvm/ADT/SetVector.h"
50 #include "llvm/ADT/StringExtras.h"
51 #include "llvm/ADT/StringSwitch.h"
52 #include "llvm/Config/llvm-config.h"
53 #include "llvm/LTO/LTO.h"
54 #include "llvm/Object/Archive.h"
55 #include "llvm/Remarks/HotnessThresholdParser.h"
56 #include "llvm/Support/CommandLine.h"
57 #include "llvm/Support/Compression.h"
58 #include "llvm/Support/FileSystem.h"
59 #include "llvm/Support/GlobPattern.h"
60 #include "llvm/Support/LEB128.h"
61 #include "llvm/Support/Parallel.h"
62 #include "llvm/Support/Path.h"
63 #include "llvm/Support/TarWriter.h"
64 #include "llvm/Support/TargetSelect.h"
65 #include "llvm/Support/TimeProfiler.h"
66 #include "llvm/Support/raw_ostream.h"
67 #include <cstdlib>
68 #include <tuple>
69 #include <utility>
70 
71 using namespace llvm;
72 using namespace llvm::ELF;
73 using namespace llvm::object;
74 using namespace llvm::sys;
75 using namespace llvm::support;
76 using namespace lld;
77 using namespace lld::elf;
78 
79 ConfigWrapper elf::config;
80 Ctx elf::ctx;
81 
82 static void setConfigs(opt::InputArgList &args);
83 static void readConfigs(opt::InputArgList &args);
84 
85 void elf::errorOrWarn(const Twine &msg) {
86   if (config->noinhibitExec)
87     warn(msg);
88   else
89     error(msg);
90 }
91 
92 void Ctx::reset() {
93   driver = LinkerDriver();
94   memoryBuffers.clear();
95   objectFiles.clear();
96   sharedFiles.clear();
97   binaryFiles.clear();
98   bitcodeFiles.clear();
99   lazyBitcodeFiles.clear();
100   inputSections.clear();
101   ehInputSections.clear();
102   duplicates.clear();
103   nonPrevailingSyms.clear();
104   whyExtractRecords.clear();
105   backwardReferences.clear();
106   hasSympart.store(false, std::memory_order_relaxed);
107   needsTlsLd.store(false, std::memory_order_relaxed);
108 }
109 
110 llvm::raw_fd_ostream Ctx::openAuxiliaryFile(llvm::StringRef filename,
111                                             std::error_code &ec) {
112   using namespace llvm::sys::fs;
113   OpenFlags flags =
114       auxiliaryFiles.insert(filename).second ? OF_None : OF_Append;
115   return {filename, ec, flags};
116 }
117 
118 namespace lld {
119 namespace elf {
120 bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
121           llvm::raw_ostream &stderrOS, bool exitEarly, bool disableOutput) {
122   // This driver-specific context will be freed later by unsafeLldMain().
123   auto *ctx = new CommonLinkerContext;
124 
125   ctx->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput);
126   ctx->e.cleanupCallback = []() {
127     elf::ctx.reset();
128     symtab = SymbolTable();
129 
130     outputSections.clear();
131     symAux.clear();
132 
133     tar = nullptr;
134     in.reset();
135 
136     partitions.clear();
137     partitions.emplace_back();
138 
139     SharedFile::vernauxNum = 0;
140   };
141   ctx->e.logName = args::getFilenameWithoutExe(args[0]);
142   ctx->e.errorLimitExceededMsg = "too many errors emitted, stopping now (use "
143                                  "--error-limit=0 to see all errors)";
144 
145   config = ConfigWrapper();
146   script = std::make_unique<LinkerScript>();
147 
148   symAux.emplace_back();
149 
150   partitions.clear();
151   partitions.emplace_back();
152 
153   config->progName = args[0];
154 
155   elf::ctx.driver.linkerMain(args);
156 
157   return errorCount() == 0;
158 }
159 } // namespace elf
160 } // namespace lld
161 
162 // Parses a linker -m option.
163 static std::tuple<ELFKind, uint16_t, uint8_t> parseEmulation(StringRef emul) {
164   uint8_t osabi = 0;
165   StringRef s = emul;
166   if (s.ends_with("_fbsd")) {
167     s = s.drop_back(5);
168     osabi = ELFOSABI_FREEBSD;
169   }
170 
171   std::pair<ELFKind, uint16_t> ret =
172       StringSwitch<std::pair<ELFKind, uint16_t>>(s)
173           .Cases("aarch64elf", "aarch64linux", {ELF64LEKind, EM_AARCH64})
174           .Cases("aarch64elfb", "aarch64linuxb", {ELF64BEKind, EM_AARCH64})
175           .Cases("armelf", "armelf_linux_eabi", {ELF32LEKind, EM_ARM})
176           .Cases("armelfb", "armelfb_linux_eabi", {ELF32BEKind, EM_ARM})
177           .Case("elf32_x86_64", {ELF32LEKind, EM_X86_64})
178           .Cases("elf32btsmip", "elf32btsmipn32", {ELF32BEKind, EM_MIPS})
179           .Cases("elf32ltsmip", "elf32ltsmipn32", {ELF32LEKind, EM_MIPS})
180           .Case("elf32lriscv", {ELF32LEKind, EM_RISCV})
181           .Cases("elf32ppc", "elf32ppclinux", {ELF32BEKind, EM_PPC})
182           .Cases("elf32lppc", "elf32lppclinux", {ELF32LEKind, EM_PPC})
183           .Case("elf32loongarch", {ELF32LEKind, EM_LOONGARCH})
184           .Case("elf64btsmip", {ELF64BEKind, EM_MIPS})
185           .Case("elf64ltsmip", {ELF64LEKind, EM_MIPS})
186           .Case("elf64lriscv", {ELF64LEKind, EM_RISCV})
187           .Case("elf64ppc", {ELF64BEKind, EM_PPC64})
188           .Case("elf64lppc", {ELF64LEKind, EM_PPC64})
189           .Cases("elf_amd64", "elf_x86_64", {ELF64LEKind, EM_X86_64})
190           .Case("elf_i386", {ELF32LEKind, EM_386})
191           .Case("elf_iamcu", {ELF32LEKind, EM_IAMCU})
192           .Case("elf64_sparc", {ELF64BEKind, EM_SPARCV9})
193           .Case("msp430elf", {ELF32LEKind, EM_MSP430})
194           .Case("elf64_amdgpu", {ELF64LEKind, EM_AMDGPU})
195           .Case("elf64loongarch", {ELF64LEKind, EM_LOONGARCH})
196           .Default({ELFNoneKind, EM_NONE});
197 
198   if (ret.first == ELFNoneKind)
199     error("unknown emulation: " + emul);
200   if (ret.second == EM_MSP430)
201     osabi = ELFOSABI_STANDALONE;
202   else if (ret.second == EM_AMDGPU)
203     osabi = ELFOSABI_AMDGPU_HSA;
204   return std::make_tuple(ret.first, ret.second, osabi);
205 }
206 
207 // Returns slices of MB by parsing MB as an archive file.
208 // Each slice consists of a member file in the archive.
209 std::vector<std::pair<MemoryBufferRef, uint64_t>> static getArchiveMembers(
210     MemoryBufferRef mb) {
211   std::unique_ptr<Archive> file =
212       CHECK(Archive::create(mb),
213             mb.getBufferIdentifier() + ": failed to parse archive");
214 
215   std::vector<std::pair<MemoryBufferRef, uint64_t>> v;
216   Error err = Error::success();
217   bool addToTar = file->isThin() && tar;
218   for (const Archive::Child &c : file->children(err)) {
219     MemoryBufferRef mbref =
220         CHECK(c.getMemoryBufferRef(),
221               mb.getBufferIdentifier() +
222                   ": could not get the buffer for a child of the archive");
223     if (addToTar)
224       tar->append(relativeToRoot(check(c.getFullName())), mbref.getBuffer());
225     v.push_back(std::make_pair(mbref, c.getChildOffset()));
226   }
227   if (err)
228     fatal(mb.getBufferIdentifier() + ": Archive::children failed: " +
229           toString(std::move(err)));
230 
231   // Take ownership of memory buffers created for members of thin archives.
232   std::vector<std::unique_ptr<MemoryBuffer>> mbs = file->takeThinBuffers();
233   std::move(mbs.begin(), mbs.end(), std::back_inserter(ctx.memoryBuffers));
234 
235   return v;
236 }
237 
238 static bool isBitcode(MemoryBufferRef mb) {
239   return identify_magic(mb.getBuffer()) == llvm::file_magic::bitcode;
240 }
241 
242 // Opens a file and create a file object. Path has to be resolved already.
243 void LinkerDriver::addFile(StringRef path, bool withLOption) {
244   using namespace sys::fs;
245 
246   std::optional<MemoryBufferRef> buffer = readFile(path);
247   if (!buffer)
248     return;
249   MemoryBufferRef mbref = *buffer;
250 
251   if (config->formatBinary) {
252     files.push_back(make<BinaryFile>(mbref));
253     return;
254   }
255 
256   switch (identify_magic(mbref.getBuffer())) {
257   case file_magic::unknown:
258     readLinkerScript(mbref);
259     return;
260   case file_magic::archive: {
261     auto members = getArchiveMembers(mbref);
262     if (inWholeArchive) {
263       for (const std::pair<MemoryBufferRef, uint64_t> &p : members) {
264         if (isBitcode(p.first))
265           files.push_back(make<BitcodeFile>(p.first, path, p.second, false));
266         else
267           files.push_back(createObjFile(p.first, path));
268       }
269       return;
270     }
271 
272     archiveFiles.emplace_back(path, members.size());
273 
274     // Handle archives and --start-lib/--end-lib using the same code path. This
275     // scans all the ELF relocatable object files and bitcode files in the
276     // archive rather than just the index file, with the benefit that the
277     // symbols are only loaded once. For many projects archives see high
278     // utilization rates and it is a net performance win. --start-lib scans
279     // symbols in the same order that llvm-ar adds them to the index, so in the
280     // common case the semantics are identical. If the archive symbol table was
281     // created in a different order, or is incomplete, this strategy has
282     // different semantics. Such output differences are considered user error.
283     //
284     // All files within the archive get the same group ID to allow mutual
285     // references for --warn-backrefs.
286     bool saved = InputFile::isInGroup;
287     InputFile::isInGroup = true;
288     for (const std::pair<MemoryBufferRef, uint64_t> &p : members) {
289       auto magic = identify_magic(p.first.getBuffer());
290       if (magic == file_magic::elf_relocatable)
291         files.push_back(createObjFile(p.first, path, true));
292       else if (magic == file_magic::bitcode)
293         files.push_back(make<BitcodeFile>(p.first, path, p.second, true));
294       else
295         warn(path + ": archive member '" + p.first.getBufferIdentifier() +
296              "' is neither ET_REL nor LLVM bitcode");
297     }
298     InputFile::isInGroup = saved;
299     if (!saved)
300       ++InputFile::nextGroupId;
301     return;
302   }
303   case file_magic::elf_shared_object: {
304     if (config->isStatic || config->relocatable) {
305       error("attempted static link of dynamic object " + path);
306       return;
307     }
308 
309     // Shared objects are identified by soname. soname is (if specified)
310     // DT_SONAME and falls back to filename. If a file was specified by -lfoo,
311     // the directory part is ignored. Note that path may be a temporary and
312     // cannot be stored into SharedFile::soName.
313     path = mbref.getBufferIdentifier();
314     auto *f =
315         make<SharedFile>(mbref, withLOption ? path::filename(path) : path);
316     f->init();
317     files.push_back(f);
318     return;
319   }
320   case file_magic::bitcode:
321     files.push_back(make<BitcodeFile>(mbref, "", 0, inLib));
322     break;
323   case file_magic::elf_relocatable:
324     files.push_back(createObjFile(mbref, "", inLib));
325     break;
326   default:
327     error(path + ": unknown file type");
328   }
329 }
330 
331 // Add a given library by searching it from input search paths.
332 void LinkerDriver::addLibrary(StringRef name) {
333   if (std::optional<std::string> path = searchLibrary(name))
334     addFile(saver().save(*path), /*withLOption=*/true);
335   else
336     error("unable to find library -l" + name, ErrorTag::LibNotFound, {name});
337 }
338 
339 // This function is called on startup. We need this for LTO since
340 // LTO calls LLVM functions to compile bitcode files to native code.
341 // Technically this can be delayed until we read bitcode files, but
342 // we don't bother to do lazily because the initialization is fast.
343 static void initLLVM() {
344   InitializeAllTargets();
345   InitializeAllTargetMCs();
346   InitializeAllAsmPrinters();
347   InitializeAllAsmParsers();
348 }
349 
350 // Some command line options or some combinations of them are not allowed.
351 // This function checks for such errors.
352 static void checkOptions() {
353   // The MIPS ABI as of 2016 does not support the GNU-style symbol lookup
354   // table which is a relatively new feature.
355   if (config->emachine == EM_MIPS && config->gnuHash)
356     error("the .gnu.hash section is not compatible with the MIPS target");
357 
358   if (config->emachine == EM_ARM) {
359     if (!config->cmseImplib) {
360       if (!config->cmseInputLib.empty())
361         error("--in-implib may not be used without --cmse-implib");
362       if (!config->cmseOutputLib.empty())
363         error("--out-implib may not be used without --cmse-implib");
364     }
365   } else {
366     if (config->cmseImplib)
367       error("--cmse-implib is only supported on ARM targets");
368     if (!config->cmseInputLib.empty())
369       error("--in-implib is only supported on ARM targets");
370     if (!config->cmseOutputLib.empty())
371       error("--out-implib is only supported on ARM targets");
372   }
373 
374   if (config->fixCortexA53Errata843419 && config->emachine != EM_AARCH64)
375     error("--fix-cortex-a53-843419 is only supported on AArch64 targets");
376 
377   if (config->fixCortexA8 && config->emachine != EM_ARM)
378     error("--fix-cortex-a8 is only supported on ARM targets");
379 
380   if (config->armBe8 && config->emachine != EM_ARM)
381     error("--be8 is only supported on ARM targets");
382 
383   if (config->fixCortexA8 && !config->isLE)
384     error("--fix-cortex-a8 is not supported on big endian targets");
385 
386   if (config->tocOptimize && config->emachine != EM_PPC64)
387     error("--toc-optimize is only supported on PowerPC64 targets");
388 
389   if (config->pcRelOptimize && config->emachine != EM_PPC64)
390     error("--pcrel-optimize is only supported on PowerPC64 targets");
391 
392   if (config->relaxGP && config->emachine != EM_RISCV)
393     error("--relax-gp is only supported on RISC-V targets");
394 
395   if (config->pie && config->shared)
396     error("-shared and -pie may not be used together");
397 
398   if (!config->shared && !config->filterList.empty())
399     error("-F may not be used without -shared");
400 
401   if (!config->shared && !config->auxiliaryList.empty())
402     error("-f may not be used without -shared");
403 
404   if (config->strip == StripPolicy::All && config->emitRelocs)
405     error("--strip-all and --emit-relocs may not be used together");
406 
407   if (config->zText && config->zIfuncNoplt)
408     error("-z text and -z ifunc-noplt may not be used together");
409 
410   if (config->relocatable) {
411     if (config->shared)
412       error("-r and -shared may not be used together");
413     if (config->gdbIndex)
414       error("-r and --gdb-index may not be used together");
415     if (config->icf != ICFLevel::None)
416       error("-r and --icf may not be used together");
417     if (config->pie)
418       error("-r and -pie may not be used together");
419     if (config->exportDynamic)
420       error("-r and --export-dynamic may not be used together");
421   }
422 
423   if (config->executeOnly) {
424     if (config->emachine != EM_AARCH64)
425       error("--execute-only is only supported on AArch64 targets");
426 
427     if (config->singleRoRx && !script->hasSectionsCommand)
428       error("--execute-only and --no-rosegment cannot be used together");
429   }
430 
431   if (config->zRetpolineplt && config->zForceIbt)
432     error("-z force-ibt may not be used with -z retpolineplt");
433 
434   if (config->emachine != EM_AARCH64) {
435     if (config->zPacPlt)
436       error("-z pac-plt only supported on AArch64");
437     if (config->zForceBti)
438       error("-z force-bti only supported on AArch64");
439     if (config->zBtiReport != "none")
440       error("-z bti-report only supported on AArch64");
441   }
442 
443   if (config->emachine != EM_386 && config->emachine != EM_X86_64 &&
444       config->zCetReport != "none")
445     error("-z cet-report only supported on X86 and X86_64");
446 }
447 
448 static const char *getReproduceOption(opt::InputArgList &args) {
449   if (auto *arg = args.getLastArg(OPT_reproduce))
450     return arg->getValue();
451   return getenv("LLD_REPRODUCE");
452 }
453 
454 static bool hasZOption(opt::InputArgList &args, StringRef key) {
455   for (auto *arg : args.filtered(OPT_z))
456     if (key == arg->getValue())
457       return true;
458   return false;
459 }
460 
461 static bool getZFlag(opt::InputArgList &args, StringRef k1, StringRef k2,
462                      bool Default) {
463   for (auto *arg : args.filtered_reverse(OPT_z)) {
464     if (k1 == arg->getValue())
465       return true;
466     if (k2 == arg->getValue())
467       return false;
468   }
469   return Default;
470 }
471 
472 static SeparateSegmentKind getZSeparate(opt::InputArgList &args) {
473   for (auto *arg : args.filtered_reverse(OPT_z)) {
474     StringRef v = arg->getValue();
475     if (v == "noseparate-code")
476       return SeparateSegmentKind::None;
477     if (v == "separate-code")
478       return SeparateSegmentKind::Code;
479     if (v == "separate-loadable-segments")
480       return SeparateSegmentKind::Loadable;
481   }
482   return SeparateSegmentKind::None;
483 }
484 
485 static GnuStackKind getZGnuStack(opt::InputArgList &args) {
486   for (auto *arg : args.filtered_reverse(OPT_z)) {
487     if (StringRef("execstack") == arg->getValue())
488       return GnuStackKind::Exec;
489     if (StringRef("noexecstack") == arg->getValue())
490       return GnuStackKind::NoExec;
491     if (StringRef("nognustack") == arg->getValue())
492       return GnuStackKind::None;
493   }
494 
495   return GnuStackKind::NoExec;
496 }
497 
498 static uint8_t getZStartStopVisibility(opt::InputArgList &args) {
499   for (auto *arg : args.filtered_reverse(OPT_z)) {
500     std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
501     if (kv.first == "start-stop-visibility") {
502       if (kv.second == "default")
503         return STV_DEFAULT;
504       else if (kv.second == "internal")
505         return STV_INTERNAL;
506       else if (kv.second == "hidden")
507         return STV_HIDDEN;
508       else if (kv.second == "protected")
509         return STV_PROTECTED;
510       error("unknown -z start-stop-visibility= value: " + StringRef(kv.second));
511     }
512   }
513   return STV_PROTECTED;
514 }
515 
516 constexpr const char *knownZFlags[] = {
517     "combreloc",
518     "copyreloc",
519     "defs",
520     "execstack",
521     "force-bti",
522     "force-ibt",
523     "global",
524     "hazardplt",
525     "ifunc-noplt",
526     "initfirst",
527     "interpose",
528     "keep-text-section-prefix",
529     "lazy",
530     "muldefs",
531     "nocombreloc",
532     "nocopyreloc",
533     "nodefaultlib",
534     "nodelete",
535     "nodlopen",
536     "noexecstack",
537     "nognustack",
538     "nokeep-text-section-prefix",
539     "nopack-relative-relocs",
540     "norelro",
541     "noseparate-code",
542     "nostart-stop-gc",
543     "notext",
544     "now",
545     "origin",
546     "pac-plt",
547     "pack-relative-relocs",
548     "rel",
549     "rela",
550     "relro",
551     "retpolineplt",
552     "rodynamic",
553     "separate-code",
554     "separate-loadable-segments",
555     "shstk",
556     "start-stop-gc",
557     "text",
558     "undefs",
559     "wxneeded",
560 };
561 
562 static bool isKnownZFlag(StringRef s) {
563   return llvm::is_contained(knownZFlags, s) ||
564          s.starts_with("common-page-size=") || s.starts_with("bti-report=") ||
565          s.starts_with("cet-report=") ||
566          s.starts_with("dead-reloc-in-nonalloc=") ||
567          s.starts_with("max-page-size=") || s.starts_with("stack-size=") ||
568          s.starts_with("start-stop-visibility=");
569 }
570 
571 // Report a warning for an unknown -z option.
572 static void checkZOptions(opt::InputArgList &args) {
573   for (auto *arg : args.filtered(OPT_z))
574     if (!isKnownZFlag(arg->getValue()))
575       warn("unknown -z value: " + StringRef(arg->getValue()));
576 }
577 
578 constexpr const char *saveTempsValues[] = {
579     "resolution", "preopt",     "promote", "internalize",  "import",
580     "opt",        "precodegen", "prelink", "combinedindex"};
581 
582 void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
583   ELFOptTable parser;
584   opt::InputArgList args = parser.parse(argsArr.slice(1));
585 
586   // Interpret these flags early because error()/warn() depend on them.
587   errorHandler().errorLimit = args::getInteger(args, OPT_error_limit, 20);
588   errorHandler().fatalWarnings =
589       args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false) &&
590       !args.hasArg(OPT_no_warnings);
591   errorHandler().suppressWarnings = args.hasArg(OPT_no_warnings);
592   checkZOptions(args);
593 
594   // Handle -help
595   if (args.hasArg(OPT_help)) {
596     printHelp();
597     return;
598   }
599 
600   // Handle -v or -version.
601   //
602   // A note about "compatible with GNU linkers" message: this is a hack for
603   // scripts generated by GNU Libtool up to 2021-10 to recognize LLD as
604   // a GNU compatible linker. See
605   // <https://lists.gnu.org/archive/html/libtool/2017-01/msg00007.html>.
606   //
607   // This is somewhat ugly hack, but in reality, we had no choice other
608   // than doing this. Considering the very long release cycle of Libtool,
609   // it is not easy to improve it to recognize LLD as a GNU compatible
610   // linker in a timely manner. Even if we can make it, there are still a
611   // lot of "configure" scripts out there that are generated by old version
612   // of Libtool. We cannot convince every software developer to migrate to
613   // the latest version and re-generate scripts. So we have this hack.
614   if (args.hasArg(OPT_v) || args.hasArg(OPT_version))
615     message(getLLDVersion() + " (compatible with GNU linkers)");
616 
617   if (const char *path = getReproduceOption(args)) {
618     // Note that --reproduce is a debug option so you can ignore it
619     // if you are trying to understand the whole picture of the code.
620     Expected<std::unique_ptr<TarWriter>> errOrWriter =
621         TarWriter::create(path, path::stem(path));
622     if (errOrWriter) {
623       tar = std::move(*errOrWriter);
624       tar->append("response.txt", createResponseFile(args));
625       tar->append("version.txt", getLLDVersion() + "\n");
626       StringRef ltoSampleProfile = args.getLastArgValue(OPT_lto_sample_profile);
627       if (!ltoSampleProfile.empty())
628         readFile(ltoSampleProfile);
629     } else {
630       error("--reproduce: " + toString(errOrWriter.takeError()));
631     }
632   }
633 
634   readConfigs(args);
635 
636   // The behavior of -v or --version is a bit strange, but this is
637   // needed for compatibility with GNU linkers.
638   if (args.hasArg(OPT_v) && !args.hasArg(OPT_INPUT))
639     return;
640   if (args.hasArg(OPT_version))
641     return;
642 
643   // Initialize time trace profiler.
644   if (config->timeTraceEnabled)
645     timeTraceProfilerInitialize(config->timeTraceGranularity, config->progName);
646 
647   {
648     llvm::TimeTraceScope timeScope("ExecuteLinker");
649 
650     initLLVM();
651     createFiles(args);
652     if (errorCount())
653       return;
654 
655     inferMachineType();
656     setConfigs(args);
657     checkOptions();
658     if (errorCount())
659       return;
660 
661     link(args);
662   }
663 
664   if (config->timeTraceEnabled) {
665     checkError(timeTraceProfilerWrite(
666         args.getLastArgValue(OPT_time_trace_eq).str(), config->outputFile));
667     timeTraceProfilerCleanup();
668   }
669 }
670 
671 static std::string getRpath(opt::InputArgList &args) {
672   SmallVector<StringRef, 0> v = args::getStrings(args, OPT_rpath);
673   return llvm::join(v.begin(), v.end(), ":");
674 }
675 
676 // Determines what we should do if there are remaining unresolved
677 // symbols after the name resolution.
678 static void setUnresolvedSymbolPolicy(opt::InputArgList &args) {
679   UnresolvedPolicy errorOrWarn = args.hasFlag(OPT_error_unresolved_symbols,
680                                               OPT_warn_unresolved_symbols, true)
681                                      ? UnresolvedPolicy::ReportError
682                                      : UnresolvedPolicy::Warn;
683   // -shared implies --unresolved-symbols=ignore-all because missing
684   // symbols are likely to be resolved at runtime.
685   bool diagRegular = !config->shared, diagShlib = !config->shared;
686 
687   for (const opt::Arg *arg : args) {
688     switch (arg->getOption().getID()) {
689     case OPT_unresolved_symbols: {
690       StringRef s = arg->getValue();
691       if (s == "ignore-all") {
692         diagRegular = false;
693         diagShlib = false;
694       } else if (s == "ignore-in-object-files") {
695         diagRegular = false;
696         diagShlib = true;
697       } else if (s == "ignore-in-shared-libs") {
698         diagRegular = true;
699         diagShlib = false;
700       } else if (s == "report-all") {
701         diagRegular = true;
702         diagShlib = true;
703       } else {
704         error("unknown --unresolved-symbols value: " + s);
705       }
706       break;
707     }
708     case OPT_no_undefined:
709       diagRegular = true;
710       break;
711     case OPT_z:
712       if (StringRef(arg->getValue()) == "defs")
713         diagRegular = true;
714       else if (StringRef(arg->getValue()) == "undefs")
715         diagRegular = false;
716       break;
717     case OPT_allow_shlib_undefined:
718       diagShlib = false;
719       break;
720     case OPT_no_allow_shlib_undefined:
721       diagShlib = true;
722       break;
723     }
724   }
725 
726   config->unresolvedSymbols =
727       diagRegular ? errorOrWarn : UnresolvedPolicy::Ignore;
728   config->unresolvedSymbolsInShlib =
729       diagShlib ? errorOrWarn : UnresolvedPolicy::Ignore;
730 }
731 
732 static Target2Policy getTarget2(opt::InputArgList &args) {
733   StringRef s = args.getLastArgValue(OPT_target2, "got-rel");
734   if (s == "rel")
735     return Target2Policy::Rel;
736   if (s == "abs")
737     return Target2Policy::Abs;
738   if (s == "got-rel")
739     return Target2Policy::GotRel;
740   error("unknown --target2 option: " + s);
741   return Target2Policy::GotRel;
742 }
743 
744 static bool isOutputFormatBinary(opt::InputArgList &args) {
745   StringRef s = args.getLastArgValue(OPT_oformat, "elf");
746   if (s == "binary")
747     return true;
748   if (!s.starts_with("elf"))
749     error("unknown --oformat value: " + s);
750   return false;
751 }
752 
753 static DiscardPolicy getDiscard(opt::InputArgList &args) {
754   auto *arg =
755       args.getLastArg(OPT_discard_all, OPT_discard_locals, OPT_discard_none);
756   if (!arg)
757     return DiscardPolicy::Default;
758   if (arg->getOption().getID() == OPT_discard_all)
759     return DiscardPolicy::All;
760   if (arg->getOption().getID() == OPT_discard_locals)
761     return DiscardPolicy::Locals;
762   return DiscardPolicy::None;
763 }
764 
765 static StringRef getDynamicLinker(opt::InputArgList &args) {
766   auto *arg = args.getLastArg(OPT_dynamic_linker, OPT_no_dynamic_linker);
767   if (!arg)
768     return "";
769   if (arg->getOption().getID() == OPT_no_dynamic_linker) {
770     // --no-dynamic-linker suppresses undefined weak symbols in .dynsym
771     config->noDynamicLinker = true;
772     return "";
773   }
774   return arg->getValue();
775 }
776 
777 static int getMemtagMode(opt::InputArgList &args) {
778   StringRef memtagModeArg = args.getLastArgValue(OPT_android_memtag_mode);
779   if (memtagModeArg.empty()) {
780     if (config->androidMemtagStack)
781       warn("--android-memtag-mode is unspecified, leaving "
782            "--android-memtag-stack a no-op");
783     else if (config->androidMemtagHeap)
784       warn("--android-memtag-mode is unspecified, leaving "
785            "--android-memtag-heap a no-op");
786     return ELF::NT_MEMTAG_LEVEL_NONE;
787   }
788 
789   if (!config->androidMemtagHeap && !config->androidMemtagStack) {
790     error("when using --android-memtag-mode, at least one of "
791           "--android-memtag-heap or "
792           "--android-memtag-stack is required");
793     return ELF::NT_MEMTAG_LEVEL_NONE;
794   }
795 
796   if (memtagModeArg == "sync")
797     return ELF::NT_MEMTAG_LEVEL_SYNC;
798   if (memtagModeArg == "async")
799     return ELF::NT_MEMTAG_LEVEL_ASYNC;
800   if (memtagModeArg == "none")
801     return ELF::NT_MEMTAG_LEVEL_NONE;
802 
803   error("unknown --android-memtag-mode value: \"" + memtagModeArg +
804         "\", should be one of {async, sync, none}");
805   return ELF::NT_MEMTAG_LEVEL_NONE;
806 }
807 
808 static ICFLevel getICF(opt::InputArgList &args) {
809   auto *arg = args.getLastArg(OPT_icf_none, OPT_icf_safe, OPT_icf_all);
810   if (!arg || arg->getOption().getID() == OPT_icf_none)
811     return ICFLevel::None;
812   if (arg->getOption().getID() == OPT_icf_safe)
813     return ICFLevel::Safe;
814   return ICFLevel::All;
815 }
816 
817 static StripPolicy getStrip(opt::InputArgList &args) {
818   if (args.hasArg(OPT_relocatable))
819     return StripPolicy::None;
820 
821   auto *arg = args.getLastArg(OPT_strip_all, OPT_strip_debug);
822   if (!arg)
823     return StripPolicy::None;
824   if (arg->getOption().getID() == OPT_strip_all)
825     return StripPolicy::All;
826   return StripPolicy::Debug;
827 }
828 
829 static uint64_t parseSectionAddress(StringRef s, opt::InputArgList &args,
830                                     const opt::Arg &arg) {
831   uint64_t va = 0;
832   if (s.starts_with("0x"))
833     s = s.drop_front(2);
834   if (!to_integer(s, va, 16))
835     error("invalid argument: " + arg.getAsString(args));
836   return va;
837 }
838 
839 static StringMap<uint64_t> getSectionStartMap(opt::InputArgList &args) {
840   StringMap<uint64_t> ret;
841   for (auto *arg : args.filtered(OPT_section_start)) {
842     StringRef name;
843     StringRef addr;
844     std::tie(name, addr) = StringRef(arg->getValue()).split('=');
845     ret[name] = parseSectionAddress(addr, args, *arg);
846   }
847 
848   if (auto *arg = args.getLastArg(OPT_Ttext))
849     ret[".text"] = parseSectionAddress(arg->getValue(), args, *arg);
850   if (auto *arg = args.getLastArg(OPT_Tdata))
851     ret[".data"] = parseSectionAddress(arg->getValue(), args, *arg);
852   if (auto *arg = args.getLastArg(OPT_Tbss))
853     ret[".bss"] = parseSectionAddress(arg->getValue(), args, *arg);
854   return ret;
855 }
856 
857 static SortSectionPolicy getSortSection(opt::InputArgList &args) {
858   StringRef s = args.getLastArgValue(OPT_sort_section);
859   if (s == "alignment")
860     return SortSectionPolicy::Alignment;
861   if (s == "name")
862     return SortSectionPolicy::Name;
863   if (!s.empty())
864     error("unknown --sort-section rule: " + s);
865   return SortSectionPolicy::Default;
866 }
867 
868 static OrphanHandlingPolicy getOrphanHandling(opt::InputArgList &args) {
869   StringRef s = args.getLastArgValue(OPT_orphan_handling, "place");
870   if (s == "warn")
871     return OrphanHandlingPolicy::Warn;
872   if (s == "error")
873     return OrphanHandlingPolicy::Error;
874   if (s != "place")
875     error("unknown --orphan-handling mode: " + s);
876   return OrphanHandlingPolicy::Place;
877 }
878 
879 // Parse --build-id or --build-id=<style>. We handle "tree" as a
880 // synonym for "sha1" because all our hash functions including
881 // --build-id=sha1 are actually tree hashes for performance reasons.
882 static std::pair<BuildIdKind, SmallVector<uint8_t, 0>>
883 getBuildId(opt::InputArgList &args) {
884   auto *arg = args.getLastArg(OPT_build_id);
885   if (!arg)
886     return {BuildIdKind::None, {}};
887 
888   StringRef s = arg->getValue();
889   if (s == "fast")
890     return {BuildIdKind::Fast, {}};
891   if (s == "md5")
892     return {BuildIdKind::Md5, {}};
893   if (s == "sha1" || s == "tree")
894     return {BuildIdKind::Sha1, {}};
895   if (s == "uuid")
896     return {BuildIdKind::Uuid, {}};
897   if (s.starts_with("0x"))
898     return {BuildIdKind::Hexstring, parseHex(s.substr(2))};
899 
900   if (s != "none")
901     error("unknown --build-id style: " + s);
902   return {BuildIdKind::None, {}};
903 }
904 
905 static std::pair<bool, bool> getPackDynRelocs(opt::InputArgList &args) {
906   StringRef s = args.getLastArgValue(OPT_pack_dyn_relocs, "none");
907   if (s == "android")
908     return {true, false};
909   if (s == "relr")
910     return {false, true};
911   if (s == "android+relr")
912     return {true, true};
913 
914   if (s != "none")
915     error("unknown --pack-dyn-relocs format: " + s);
916   return {false, false};
917 }
918 
919 static void readCallGraph(MemoryBufferRef mb) {
920   // Build a map from symbol name to section
921   DenseMap<StringRef, Symbol *> map;
922   for (ELFFileBase *file : ctx.objectFiles)
923     for (Symbol *sym : file->getSymbols())
924       map[sym->getName()] = sym;
925 
926   auto findSection = [&](StringRef name) -> InputSectionBase * {
927     Symbol *sym = map.lookup(name);
928     if (!sym) {
929       if (config->warnSymbolOrdering)
930         warn(mb.getBufferIdentifier() + ": no such symbol: " + name);
931       return nullptr;
932     }
933     maybeWarnUnorderableSymbol(sym);
934 
935     if (Defined *dr = dyn_cast_or_null<Defined>(sym))
936       return dyn_cast_or_null<InputSectionBase>(dr->section);
937     return nullptr;
938   };
939 
940   for (StringRef line : args::getLines(mb)) {
941     SmallVector<StringRef, 3> fields;
942     line.split(fields, ' ');
943     uint64_t count;
944 
945     if (fields.size() != 3 || !to_integer(fields[2], count)) {
946       error(mb.getBufferIdentifier() + ": parse error");
947       return;
948     }
949 
950     if (InputSectionBase *from = findSection(fields[0]))
951       if (InputSectionBase *to = findSection(fields[1]))
952         config->callGraphProfile[std::make_pair(from, to)] += count;
953   }
954 }
955 
956 // If SHT_LLVM_CALL_GRAPH_PROFILE and its relocation section exist, returns
957 // true and populates cgProfile and symbolIndices.
958 template <class ELFT>
959 static bool
960 processCallGraphRelocations(SmallVector<uint32_t, 32> &symbolIndices,
961                             ArrayRef<typename ELFT::CGProfile> &cgProfile,
962                             ObjFile<ELFT> *inputObj) {
963   if (inputObj->cgProfileSectionIndex == SHN_UNDEF)
964     return false;
965 
966   ArrayRef<Elf_Shdr_Impl<ELFT>> objSections =
967       inputObj->template getELFShdrs<ELFT>();
968   symbolIndices.clear();
969   const ELFFile<ELFT> &obj = inputObj->getObj();
970   cgProfile =
971       check(obj.template getSectionContentsAsArray<typename ELFT::CGProfile>(
972           objSections[inputObj->cgProfileSectionIndex]));
973 
974   for (size_t i = 0, e = objSections.size(); i < e; ++i) {
975     const Elf_Shdr_Impl<ELFT> &sec = objSections[i];
976     if (sec.sh_info == inputObj->cgProfileSectionIndex) {
977       if (sec.sh_type == SHT_RELA) {
978         ArrayRef<typename ELFT::Rela> relas =
979             CHECK(obj.relas(sec), "could not retrieve cg profile rela section");
980         for (const typename ELFT::Rela &rel : relas)
981           symbolIndices.push_back(rel.getSymbol(config->isMips64EL));
982         break;
983       }
984       if (sec.sh_type == SHT_REL) {
985         ArrayRef<typename ELFT::Rel> rels =
986             CHECK(obj.rels(sec), "could not retrieve cg profile rel section");
987         for (const typename ELFT::Rel &rel : rels)
988           symbolIndices.push_back(rel.getSymbol(config->isMips64EL));
989         break;
990       }
991     }
992   }
993   if (symbolIndices.empty())
994     warn("SHT_LLVM_CALL_GRAPH_PROFILE exists, but relocation section doesn't");
995   return !symbolIndices.empty();
996 }
997 
998 template <class ELFT> static void readCallGraphsFromObjectFiles() {
999   SmallVector<uint32_t, 32> symbolIndices;
1000   ArrayRef<typename ELFT::CGProfile> cgProfile;
1001   for (auto file : ctx.objectFiles) {
1002     auto *obj = cast<ObjFile<ELFT>>(file);
1003     if (!processCallGraphRelocations(symbolIndices, cgProfile, obj))
1004       continue;
1005 
1006     if (symbolIndices.size() != cgProfile.size() * 2)
1007       fatal("number of relocations doesn't match Weights");
1008 
1009     for (uint32_t i = 0, size = cgProfile.size(); i < size; ++i) {
1010       const Elf_CGProfile_Impl<ELFT> &cgpe = cgProfile[i];
1011       uint32_t fromIndex = symbolIndices[i * 2];
1012       uint32_t toIndex = symbolIndices[i * 2 + 1];
1013       auto *fromSym = dyn_cast<Defined>(&obj->getSymbol(fromIndex));
1014       auto *toSym = dyn_cast<Defined>(&obj->getSymbol(toIndex));
1015       if (!fromSym || !toSym)
1016         continue;
1017 
1018       auto *from = dyn_cast_or_null<InputSectionBase>(fromSym->section);
1019       auto *to = dyn_cast_or_null<InputSectionBase>(toSym->section);
1020       if (from && to)
1021         config->callGraphProfile[{from, to}] += cgpe.cgp_weight;
1022     }
1023   }
1024 }
1025 
1026 static DebugCompressionType getCompressionType(StringRef s, StringRef option) {
1027   DebugCompressionType type = StringSwitch<DebugCompressionType>(s)
1028                                   .Case("zlib", DebugCompressionType::Zlib)
1029                                   .Case("zstd", DebugCompressionType::Zstd)
1030                                   .Default(DebugCompressionType::None);
1031   if (type == DebugCompressionType::None) {
1032     if (s != "none")
1033       error("unknown " + option + " value: " + s);
1034   } else if (const char *reason = compression::getReasonIfUnsupported(
1035                  compression::formatFor(type))) {
1036     error(option + ": " + reason);
1037   }
1038   return type;
1039 }
1040 
1041 static StringRef getAliasSpelling(opt::Arg *arg) {
1042   if (const opt::Arg *alias = arg->getAlias())
1043     return alias->getSpelling();
1044   return arg->getSpelling();
1045 }
1046 
1047 static std::pair<StringRef, StringRef> getOldNewOptions(opt::InputArgList &args,
1048                                                         unsigned id) {
1049   auto *arg = args.getLastArg(id);
1050   if (!arg)
1051     return {"", ""};
1052 
1053   StringRef s = arg->getValue();
1054   std::pair<StringRef, StringRef> ret = s.split(';');
1055   if (ret.second.empty())
1056     error(getAliasSpelling(arg) + " expects 'old;new' format, but got " + s);
1057   return ret;
1058 }
1059 
1060 // Parse options of the form "old;new[;extra]".
1061 static std::tuple<StringRef, StringRef, StringRef>
1062 getOldNewOptionsExtra(opt::InputArgList &args, unsigned id) {
1063   auto [oldDir, second] = getOldNewOptions(args, id);
1064   auto [newDir, extraDir] = second.split(';');
1065   return {oldDir, newDir, extraDir};
1066 }
1067 
1068 // Parse the symbol ordering file and warn for any duplicate entries.
1069 static SmallVector<StringRef, 0> getSymbolOrderingFile(MemoryBufferRef mb) {
1070   SetVector<StringRef, SmallVector<StringRef, 0>> names;
1071   for (StringRef s : args::getLines(mb))
1072     if (!names.insert(s) && config->warnSymbolOrdering)
1073       warn(mb.getBufferIdentifier() + ": duplicate ordered symbol: " + s);
1074 
1075   return names.takeVector();
1076 }
1077 
1078 static bool getIsRela(opt::InputArgList &args) {
1079   // If -z rel or -z rela is specified, use the last option.
1080   for (auto *arg : args.filtered_reverse(OPT_z)) {
1081     StringRef s(arg->getValue());
1082     if (s == "rel")
1083       return false;
1084     if (s == "rela")
1085       return true;
1086   }
1087 
1088   // Otherwise use the psABI defined relocation entry format.
1089   uint16_t m = config->emachine;
1090   return m == EM_AARCH64 || m == EM_AMDGPU || m == EM_HEXAGON ||
1091          m == EM_LOONGARCH || m == EM_PPC || m == EM_PPC64 || m == EM_RISCV ||
1092          m == EM_X86_64;
1093 }
1094 
1095 static void parseClangOption(StringRef opt, const Twine &msg) {
1096   std::string err;
1097   raw_string_ostream os(err);
1098 
1099   const char *argv[] = {config->progName.data(), opt.data()};
1100   if (cl::ParseCommandLineOptions(2, argv, "", &os))
1101     return;
1102   os.flush();
1103   error(msg + ": " + StringRef(err).trim());
1104 }
1105 
1106 // Checks the parameter of the bti-report and cet-report options.
1107 static bool isValidReportString(StringRef arg) {
1108   return arg == "none" || arg == "warning" || arg == "error";
1109 }
1110 
1111 // Process a remap pattern 'from-glob=to-file'.
1112 static bool remapInputs(StringRef line, const Twine &location) {
1113   SmallVector<StringRef, 0> fields;
1114   line.split(fields, '=');
1115   if (fields.size() != 2 || fields[1].empty()) {
1116     error(location + ": parse error, not 'from-glob=to-file'");
1117     return true;
1118   }
1119   if (!hasWildcard(fields[0]))
1120     config->remapInputs[fields[0]] = fields[1];
1121   else if (Expected<GlobPattern> pat = GlobPattern::create(fields[0]))
1122     config->remapInputsWildcards.emplace_back(std::move(*pat), fields[1]);
1123   else {
1124     error(location + ": " + toString(pat.takeError()));
1125     return true;
1126   }
1127   return false;
1128 }
1129 
1130 // Initializes Config members by the command line options.
1131 static void readConfigs(opt::InputArgList &args) {
1132   errorHandler().verbose = args.hasArg(OPT_verbose);
1133   errorHandler().vsDiagnostics =
1134       args.hasArg(OPT_visual_studio_diagnostics_format, false);
1135 
1136   config->allowMultipleDefinition =
1137       args.hasFlag(OPT_allow_multiple_definition,
1138                    OPT_no_allow_multiple_definition, false) ||
1139       hasZOption(args, "muldefs");
1140   config->androidMemtagHeap =
1141       args.hasFlag(OPT_android_memtag_heap, OPT_no_android_memtag_heap, false);
1142   config->androidMemtagStack = args.hasFlag(OPT_android_memtag_stack,
1143                                             OPT_no_android_memtag_stack, false);
1144   config->androidMemtagMode = getMemtagMode(args);
1145   config->auxiliaryList = args::getStrings(args, OPT_auxiliary);
1146   config->armBe8 = args.hasArg(OPT_be8);
1147   if (opt::Arg *arg =
1148           args.getLastArg(OPT_Bno_symbolic, OPT_Bsymbolic_non_weak_functions,
1149                           OPT_Bsymbolic_functions, OPT_Bsymbolic)) {
1150     if (arg->getOption().matches(OPT_Bsymbolic_non_weak_functions))
1151       config->bsymbolic = BsymbolicKind::NonWeakFunctions;
1152     else if (arg->getOption().matches(OPT_Bsymbolic_functions))
1153       config->bsymbolic = BsymbolicKind::Functions;
1154     else if (arg->getOption().matches(OPT_Bsymbolic))
1155       config->bsymbolic = BsymbolicKind::All;
1156   }
1157   config->checkSections =
1158       args.hasFlag(OPT_check_sections, OPT_no_check_sections, true);
1159   config->chroot = args.getLastArgValue(OPT_chroot);
1160   config->compressDebugSections = getCompressionType(
1161       args.getLastArgValue(OPT_compress_debug_sections, "none"),
1162       "--compress-debug-sections");
1163   config->cref = args.hasArg(OPT_cref);
1164   config->optimizeBBJumps =
1165       args.hasFlag(OPT_optimize_bb_jumps, OPT_no_optimize_bb_jumps, false);
1166   config->demangle = args.hasFlag(OPT_demangle, OPT_no_demangle, true);
1167   config->dependencyFile = args.getLastArgValue(OPT_dependency_file);
1168   config->dependentLibraries = args.hasFlag(OPT_dependent_libraries, OPT_no_dependent_libraries, true);
1169   config->disableVerify = args.hasArg(OPT_disable_verify);
1170   config->discard = getDiscard(args);
1171   config->dwoDir = args.getLastArgValue(OPT_plugin_opt_dwo_dir_eq);
1172   config->dynamicLinker = getDynamicLinker(args);
1173   config->ehFrameHdr =
1174       args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
1175   config->emitLLVM = args.hasArg(OPT_plugin_opt_emit_llvm, false);
1176   config->emitRelocs = args.hasArg(OPT_emit_relocs);
1177   config->callGraphProfileSort = args.hasFlag(
1178       OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort, true);
1179   config->enableNewDtags =
1180       args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true);
1181   config->entry = args.getLastArgValue(OPT_entry);
1182 
1183   errorHandler().errorHandlingScript =
1184       args.getLastArgValue(OPT_error_handling_script);
1185 
1186   config->executeOnly =
1187       args.hasFlag(OPT_execute_only, OPT_no_execute_only, false);
1188   config->exportDynamic =
1189       args.hasFlag(OPT_export_dynamic, OPT_no_export_dynamic, false) ||
1190       args.hasArg(OPT_shared);
1191   config->filterList = args::getStrings(args, OPT_filter);
1192   config->fini = args.getLastArgValue(OPT_fini, "_fini");
1193   config->fixCortexA53Errata843419 = args.hasArg(OPT_fix_cortex_a53_843419) &&
1194                                      !args.hasArg(OPT_relocatable);
1195   config->cmseImplib = args.hasArg(OPT_cmse_implib);
1196   config->cmseInputLib = args.getLastArgValue(OPT_in_implib);
1197   config->cmseOutputLib = args.getLastArgValue(OPT_out_implib);
1198   config->fixCortexA8 =
1199       args.hasArg(OPT_fix_cortex_a8) && !args.hasArg(OPT_relocatable);
1200   config->fortranCommon =
1201       args.hasFlag(OPT_fortran_common, OPT_no_fortran_common, false);
1202   config->gcSections = args.hasFlag(OPT_gc_sections, OPT_no_gc_sections, false);
1203   config->gnuUnique = args.hasFlag(OPT_gnu_unique, OPT_no_gnu_unique, true);
1204   config->gdbIndex = args.hasFlag(OPT_gdb_index, OPT_no_gdb_index, false);
1205   config->icf = getICF(args);
1206   config->ignoreDataAddressEquality =
1207       args.hasArg(OPT_ignore_data_address_equality);
1208   config->ignoreFunctionAddressEquality =
1209       args.hasArg(OPT_ignore_function_address_equality);
1210   config->init = args.getLastArgValue(OPT_init, "_init");
1211   config->ltoAAPipeline = args.getLastArgValue(OPT_lto_aa_pipeline);
1212   config->ltoCSProfileGenerate = args.hasArg(OPT_lto_cs_profile_generate);
1213   config->ltoCSProfileFile = args.getLastArgValue(OPT_lto_cs_profile_file);
1214   config->ltoPGOWarnMismatch = args.hasFlag(OPT_lto_pgo_warn_mismatch,
1215                                             OPT_no_lto_pgo_warn_mismatch, true);
1216   config->ltoDebugPassManager = args.hasArg(OPT_lto_debug_pass_manager);
1217   config->ltoEmitAsm = args.hasArg(OPT_lto_emit_asm);
1218   config->ltoNewPmPasses = args.getLastArgValue(OPT_lto_newpm_passes);
1219   config->ltoWholeProgramVisibility =
1220       args.hasFlag(OPT_lto_whole_program_visibility,
1221                    OPT_no_lto_whole_program_visibility, false);
1222   config->ltoo = args::getInteger(args, OPT_lto_O, 2);
1223   if (config->ltoo > 3)
1224     error("invalid optimization level for LTO: " + Twine(config->ltoo));
1225   unsigned ltoCgo =
1226       args::getInteger(args, OPT_lto_CGO, args::getCGOptLevel(config->ltoo));
1227   if (auto level = CodeGenOpt::getLevel(ltoCgo))
1228     config->ltoCgo = *level;
1229   else
1230     error("invalid codegen optimization level for LTO: " + Twine(ltoCgo));
1231   config->ltoObjPath = args.getLastArgValue(OPT_lto_obj_path_eq);
1232   config->ltoPartitions = args::getInteger(args, OPT_lto_partitions, 1);
1233   config->ltoSampleProfile = args.getLastArgValue(OPT_lto_sample_profile);
1234   config->ltoBasicBlockSections =
1235       args.getLastArgValue(OPT_lto_basic_block_sections);
1236   config->ltoUniqueBasicBlockSectionNames =
1237       args.hasFlag(OPT_lto_unique_basic_block_section_names,
1238                    OPT_no_lto_unique_basic_block_section_names, false);
1239   config->mapFile = args.getLastArgValue(OPT_Map);
1240   config->mipsGotSize = args::getInteger(args, OPT_mips_got_size, 0xfff0);
1241   config->mergeArmExidx =
1242       args.hasFlag(OPT_merge_exidx_entries, OPT_no_merge_exidx_entries, true);
1243   config->mmapOutputFile =
1244       args.hasFlag(OPT_mmap_output_file, OPT_no_mmap_output_file, true);
1245   config->nmagic = args.hasFlag(OPT_nmagic, OPT_no_nmagic, false);
1246   config->noinhibitExec = args.hasArg(OPT_noinhibit_exec);
1247   config->nostdlib = args.hasArg(OPT_nostdlib);
1248   config->oFormatBinary = isOutputFormatBinary(args);
1249   config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false);
1250   config->optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename);
1251   config->optStatsFilename = args.getLastArgValue(OPT_plugin_opt_stats_file);
1252 
1253   // Parse remarks hotness threshold. Valid value is either integer or 'auto'.
1254   if (auto *arg = args.getLastArg(OPT_opt_remarks_hotness_threshold)) {
1255     auto resultOrErr = remarks::parseHotnessThresholdOption(arg->getValue());
1256     if (!resultOrErr)
1257       error(arg->getSpelling() + ": invalid argument '" + arg->getValue() +
1258             "', only integer or 'auto' is supported");
1259     else
1260       config->optRemarksHotnessThreshold = *resultOrErr;
1261   }
1262 
1263   config->optRemarksPasses = args.getLastArgValue(OPT_opt_remarks_passes);
1264   config->optRemarksWithHotness = args.hasArg(OPT_opt_remarks_with_hotness);
1265   config->optRemarksFormat = args.getLastArgValue(OPT_opt_remarks_format);
1266   config->optimize = args::getInteger(args, OPT_O, 1);
1267   config->orphanHandling = getOrphanHandling(args);
1268   config->outputFile = args.getLastArgValue(OPT_o);
1269   config->packageMetadata = args.getLastArgValue(OPT_package_metadata);
1270   config->pie = args.hasFlag(OPT_pie, OPT_no_pie, false);
1271   config->printIcfSections =
1272       args.hasFlag(OPT_print_icf_sections, OPT_no_print_icf_sections, false);
1273   config->printGcSections =
1274       args.hasFlag(OPT_print_gc_sections, OPT_no_print_gc_sections, false);
1275   config->printMemoryUsage = args.hasArg(OPT_print_memory_usage);
1276   config->printArchiveStats = args.getLastArgValue(OPT_print_archive_stats);
1277   config->printSymbolOrder =
1278       args.getLastArgValue(OPT_print_symbol_order);
1279   config->relax = args.hasFlag(OPT_relax, OPT_no_relax, true);
1280   config->relaxGP = args.hasFlag(OPT_relax_gp, OPT_no_relax_gp, false);
1281   config->rpath = getRpath(args);
1282   config->relocatable = args.hasArg(OPT_relocatable);
1283 
1284   if (args.hasArg(OPT_save_temps)) {
1285     // --save-temps implies saving all temps.
1286     for (const char *s : saveTempsValues)
1287       config->saveTempsArgs.insert(s);
1288   } else {
1289     for (auto *arg : args.filtered(OPT_save_temps_eq)) {
1290       StringRef s = arg->getValue();
1291       if (llvm::is_contained(saveTempsValues, s))
1292         config->saveTempsArgs.insert(s);
1293       else
1294         error("unknown --save-temps value: " + s);
1295     }
1296   }
1297 
1298   config->searchPaths = args::getStrings(args, OPT_library_path);
1299   config->sectionStartMap = getSectionStartMap(args);
1300   config->shared = args.hasArg(OPT_shared);
1301   config->singleRoRx = !args.hasFlag(OPT_rosegment, OPT_no_rosegment, true);
1302   config->soName = args.getLastArgValue(OPT_soname);
1303   config->sortSection = getSortSection(args);
1304   config->splitStackAdjustSize = args::getInteger(args, OPT_split_stack_adjust_size, 16384);
1305   config->strip = getStrip(args);
1306   config->sysroot = args.getLastArgValue(OPT_sysroot);
1307   config->target1Rel = args.hasFlag(OPT_target1_rel, OPT_target1_abs, false);
1308   config->target2 = getTarget2(args);
1309   config->thinLTOCacheDir = args.getLastArgValue(OPT_thinlto_cache_dir);
1310   config->thinLTOCachePolicy = CHECK(
1311       parseCachePruningPolicy(args.getLastArgValue(OPT_thinlto_cache_policy)),
1312       "--thinlto-cache-policy: invalid cache policy");
1313   config->thinLTOEmitImportsFiles = args.hasArg(OPT_thinlto_emit_imports_files);
1314   config->thinLTOEmitIndexFiles = args.hasArg(OPT_thinlto_emit_index_files) ||
1315                                   args.hasArg(OPT_thinlto_index_only) ||
1316                                   args.hasArg(OPT_thinlto_index_only_eq);
1317   config->thinLTOIndexOnly = args.hasArg(OPT_thinlto_index_only) ||
1318                              args.hasArg(OPT_thinlto_index_only_eq);
1319   config->thinLTOIndexOnlyArg = args.getLastArgValue(OPT_thinlto_index_only_eq);
1320   config->thinLTOObjectSuffixReplace =
1321       getOldNewOptions(args, OPT_thinlto_object_suffix_replace_eq);
1322   std::tie(config->thinLTOPrefixReplaceOld, config->thinLTOPrefixReplaceNew,
1323            config->thinLTOPrefixReplaceNativeObject) =
1324       getOldNewOptionsExtra(args, OPT_thinlto_prefix_replace_eq);
1325   if (config->thinLTOEmitIndexFiles && !config->thinLTOIndexOnly) {
1326     if (args.hasArg(OPT_thinlto_object_suffix_replace_eq))
1327       error("--thinlto-object-suffix-replace is not supported with "
1328             "--thinlto-emit-index-files");
1329     else if (args.hasArg(OPT_thinlto_prefix_replace_eq))
1330       error("--thinlto-prefix-replace is not supported with "
1331             "--thinlto-emit-index-files");
1332   }
1333   if (!config->thinLTOPrefixReplaceNativeObject.empty() &&
1334       config->thinLTOIndexOnlyArg.empty()) {
1335     error("--thinlto-prefix-replace=old_dir;new_dir;obj_dir must be used with "
1336           "--thinlto-index-only=");
1337   }
1338   config->thinLTOModulesToCompile =
1339       args::getStrings(args, OPT_thinlto_single_module_eq);
1340   config->timeTraceEnabled = args.hasArg(OPT_time_trace_eq);
1341   config->timeTraceGranularity =
1342       args::getInteger(args, OPT_time_trace_granularity, 500);
1343   config->trace = args.hasArg(OPT_trace);
1344   config->undefined = args::getStrings(args, OPT_undefined);
1345   config->undefinedVersion =
1346       args.hasFlag(OPT_undefined_version, OPT_no_undefined_version, false);
1347   config->unique = args.hasArg(OPT_unique);
1348   config->useAndroidRelrTags = args.hasFlag(
1349       OPT_use_android_relr_tags, OPT_no_use_android_relr_tags, false);
1350   config->warnBackrefs =
1351       args.hasFlag(OPT_warn_backrefs, OPT_no_warn_backrefs, false);
1352   config->warnCommon = args.hasFlag(OPT_warn_common, OPT_no_warn_common, false);
1353   config->warnSymbolOrdering =
1354       args.hasFlag(OPT_warn_symbol_ordering, OPT_no_warn_symbol_ordering, true);
1355   config->whyExtract = args.getLastArgValue(OPT_why_extract);
1356   config->zCombreloc = getZFlag(args, "combreloc", "nocombreloc", true);
1357   config->zCopyreloc = getZFlag(args, "copyreloc", "nocopyreloc", true);
1358   config->zForceBti = hasZOption(args, "force-bti");
1359   config->zForceIbt = hasZOption(args, "force-ibt");
1360   config->zGlobal = hasZOption(args, "global");
1361   config->zGnustack = getZGnuStack(args);
1362   config->zHazardplt = hasZOption(args, "hazardplt");
1363   config->zIfuncNoplt = hasZOption(args, "ifunc-noplt");
1364   config->zInitfirst = hasZOption(args, "initfirst");
1365   config->zInterpose = hasZOption(args, "interpose");
1366   config->zKeepTextSectionPrefix = getZFlag(
1367       args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
1368   config->zNodefaultlib = hasZOption(args, "nodefaultlib");
1369   config->zNodelete = hasZOption(args, "nodelete");
1370   config->zNodlopen = hasZOption(args, "nodlopen");
1371   config->zNow = getZFlag(args, "now", "lazy", false);
1372   config->zOrigin = hasZOption(args, "origin");
1373   config->zPacPlt = hasZOption(args, "pac-plt");
1374   config->zRelro = getZFlag(args, "relro", "norelro", true);
1375   config->zRetpolineplt = hasZOption(args, "retpolineplt");
1376   config->zRodynamic = hasZOption(args, "rodynamic");
1377   config->zSeparate = getZSeparate(args);
1378   config->zShstk = hasZOption(args, "shstk");
1379   config->zStackSize = args::getZOptionValue(args, OPT_z, "stack-size", 0);
1380   config->zStartStopGC =
1381       getZFlag(args, "start-stop-gc", "nostart-stop-gc", true);
1382   config->zStartStopVisibility = getZStartStopVisibility(args);
1383   config->zText = getZFlag(args, "text", "notext", true);
1384   config->zWxneeded = hasZOption(args, "wxneeded");
1385   setUnresolvedSymbolPolicy(args);
1386   config->power10Stubs = args.getLastArgValue(OPT_power10_stubs_eq) != "no";
1387 
1388   if (opt::Arg *arg = args.getLastArg(OPT_eb, OPT_el)) {
1389     if (arg->getOption().matches(OPT_eb))
1390       config->optEB = true;
1391     else
1392       config->optEL = true;
1393   }
1394 
1395   for (opt::Arg *arg : args.filtered(OPT_remap_inputs)) {
1396     StringRef value(arg->getValue());
1397     remapInputs(value, arg->getSpelling());
1398   }
1399   for (opt::Arg *arg : args.filtered(OPT_remap_inputs_file)) {
1400     StringRef filename(arg->getValue());
1401     std::optional<MemoryBufferRef> buffer = readFile(filename);
1402     if (!buffer)
1403       continue;
1404     // Parse 'from-glob=to-file' lines, ignoring #-led comments.
1405     for (auto [lineno, line] : llvm::enumerate(args::getLines(*buffer)))
1406       if (remapInputs(line, filename + ":" + Twine(lineno + 1)))
1407         break;
1408   }
1409 
1410   for (opt::Arg *arg : args.filtered(OPT_shuffle_sections)) {
1411     constexpr StringRef errPrefix = "--shuffle-sections=: ";
1412     std::pair<StringRef, StringRef> kv = StringRef(arg->getValue()).split('=');
1413     if (kv.first.empty() || kv.second.empty()) {
1414       error(errPrefix + "expected <section_glob>=<seed>, but got '" +
1415             arg->getValue() + "'");
1416       continue;
1417     }
1418     // Signed so that <section_glob>=-1 is allowed.
1419     int64_t v;
1420     if (!to_integer(kv.second, v))
1421       error(errPrefix + "expected an integer, but got '" + kv.second + "'");
1422     else if (Expected<GlobPattern> pat = GlobPattern::create(kv.first))
1423       config->shuffleSections.emplace_back(std::move(*pat), uint32_t(v));
1424     else
1425       error(errPrefix + toString(pat.takeError()));
1426   }
1427 
1428   auto reports = {std::make_pair("bti-report", &config->zBtiReport),
1429                   std::make_pair("cet-report", &config->zCetReport)};
1430   for (opt::Arg *arg : args.filtered(OPT_z)) {
1431     std::pair<StringRef, StringRef> option =
1432         StringRef(arg->getValue()).split('=');
1433     for (auto reportArg : reports) {
1434       if (option.first != reportArg.first)
1435         continue;
1436       if (!isValidReportString(option.second)) {
1437         error(Twine("-z ") + reportArg.first + "= parameter " + option.second +
1438               " is not recognized");
1439         continue;
1440       }
1441       *reportArg.second = option.second;
1442     }
1443   }
1444 
1445   for (opt::Arg *arg : args.filtered(OPT_z)) {
1446     std::pair<StringRef, StringRef> option =
1447         StringRef(arg->getValue()).split('=');
1448     if (option.first != "dead-reloc-in-nonalloc")
1449       continue;
1450     constexpr StringRef errPrefix = "-z dead-reloc-in-nonalloc=: ";
1451     std::pair<StringRef, StringRef> kv = option.second.split('=');
1452     if (kv.first.empty() || kv.second.empty()) {
1453       error(errPrefix + "expected <section_glob>=<value>");
1454       continue;
1455     }
1456     uint64_t v;
1457     if (!to_integer(kv.second, v))
1458       error(errPrefix + "expected a non-negative integer, but got '" +
1459             kv.second + "'");
1460     else if (Expected<GlobPattern> pat = GlobPattern::create(kv.first))
1461       config->deadRelocInNonAlloc.emplace_back(std::move(*pat), v);
1462     else
1463       error(errPrefix + toString(pat.takeError()));
1464   }
1465 
1466   cl::ResetAllOptionOccurrences();
1467 
1468   // Parse LTO options.
1469   if (auto *arg = args.getLastArg(OPT_plugin_opt_mcpu_eq))
1470     parseClangOption(saver().save("-mcpu=" + StringRef(arg->getValue())),
1471                      arg->getSpelling());
1472 
1473   for (opt::Arg *arg : args.filtered(OPT_plugin_opt_eq_minus))
1474     parseClangOption(std::string("-") + arg->getValue(), arg->getSpelling());
1475 
1476   // GCC collect2 passes -plugin-opt=path/to/lto-wrapper with an absolute or
1477   // relative path. Just ignore. If not ended with "lto-wrapper" (or
1478   // "lto-wrapper.exe" for GCC cross-compiled for Windows), consider it an
1479   // unsupported LLVMgold.so option and error.
1480   for (opt::Arg *arg : args.filtered(OPT_plugin_opt_eq)) {
1481     StringRef v(arg->getValue());
1482     if (!v.ends_with("lto-wrapper") && !v.ends_with("lto-wrapper.exe"))
1483       error(arg->getSpelling() + ": unknown plugin option '" + arg->getValue() +
1484             "'");
1485   }
1486 
1487   config->passPlugins = args::getStrings(args, OPT_load_pass_plugins);
1488 
1489   // Parse -mllvm options.
1490   for (const auto *arg : args.filtered(OPT_mllvm)) {
1491     parseClangOption(arg->getValue(), arg->getSpelling());
1492     config->mllvmOpts.emplace_back(arg->getValue());
1493   }
1494 
1495   config->ltoKind = LtoKind::Default;
1496   if (auto *arg = args.getLastArg(OPT_lto)) {
1497     StringRef s = arg->getValue();
1498     if (s == "thin")
1499       config->ltoKind = LtoKind::UnifiedThin;
1500     else if (s == "full")
1501       config->ltoKind = LtoKind::UnifiedRegular;
1502     else if (s == "default")
1503       config->ltoKind = LtoKind::Default;
1504     else
1505       error("unknown LTO mode: " + s);
1506   }
1507 
1508   // --threads= takes a positive integer and provides the default value for
1509   // --thinlto-jobs=. If unspecified, cap the number of threads since
1510   // overhead outweighs optimization for used parallel algorithms for the
1511   // non-LTO parts.
1512   if (auto *arg = args.getLastArg(OPT_threads)) {
1513     StringRef v(arg->getValue());
1514     unsigned threads = 0;
1515     if (!llvm::to_integer(v, threads, 0) || threads == 0)
1516       error(arg->getSpelling() + ": expected a positive integer, but got '" +
1517             arg->getValue() + "'");
1518     parallel::strategy = hardware_concurrency(threads);
1519     config->thinLTOJobs = v;
1520   } else if (parallel::strategy.compute_thread_count() > 16) {
1521     log("set maximum concurrency to 16, specify --threads= to change");
1522     parallel::strategy = hardware_concurrency(16);
1523   }
1524   if (auto *arg = args.getLastArg(OPT_thinlto_jobs_eq))
1525     config->thinLTOJobs = arg->getValue();
1526   config->threadCount = parallel::strategy.compute_thread_count();
1527 
1528   if (config->ltoPartitions == 0)
1529     error("--lto-partitions: number of threads must be > 0");
1530   if (!get_threadpool_strategy(config->thinLTOJobs))
1531     error("--thinlto-jobs: invalid job count: " + config->thinLTOJobs);
1532 
1533   if (config->splitStackAdjustSize < 0)
1534     error("--split-stack-adjust-size: size must be >= 0");
1535 
1536   // The text segment is traditionally the first segment, whose address equals
1537   // the base address. However, lld places the R PT_LOAD first. -Ttext-segment
1538   // is an old-fashioned option that does not play well with lld's layout.
1539   // Suggest --image-base as a likely alternative.
1540   if (args.hasArg(OPT_Ttext_segment))
1541     error("-Ttext-segment is not supported. Use --image-base if you "
1542           "intend to set the base address");
1543 
1544   // Parse ELF{32,64}{LE,BE} and CPU type.
1545   if (auto *arg = args.getLastArg(OPT_m)) {
1546     StringRef s = arg->getValue();
1547     std::tie(config->ekind, config->emachine, config->osabi) =
1548         parseEmulation(s);
1549     config->mipsN32Abi =
1550         (s.starts_with("elf32btsmipn32") || s.starts_with("elf32ltsmipn32"));
1551     config->emulation = s;
1552   }
1553 
1554   // Parse --hash-style={sysv,gnu,both}.
1555   if (auto *arg = args.getLastArg(OPT_hash_style)) {
1556     StringRef s = arg->getValue();
1557     if (s == "sysv")
1558       config->sysvHash = true;
1559     else if (s == "gnu")
1560       config->gnuHash = true;
1561     else if (s == "both")
1562       config->sysvHash = config->gnuHash = true;
1563     else
1564       error("unknown --hash-style: " + s);
1565   }
1566 
1567   if (args.hasArg(OPT_print_map))
1568     config->mapFile = "-";
1569 
1570   // Page alignment can be disabled by the -n (--nmagic) and -N (--omagic).
1571   // As PT_GNU_RELRO relies on Paging, do not create it when we have disabled
1572   // it.
1573   if (config->nmagic || config->omagic)
1574     config->zRelro = false;
1575 
1576   std::tie(config->buildId, config->buildIdVector) = getBuildId(args);
1577 
1578   if (getZFlag(args, "pack-relative-relocs", "nopack-relative-relocs", false)) {
1579     config->relrGlibc = true;
1580     config->relrPackDynRelocs = true;
1581   } else {
1582     std::tie(config->androidPackDynRelocs, config->relrPackDynRelocs) =
1583         getPackDynRelocs(args);
1584   }
1585 
1586   if (auto *arg = args.getLastArg(OPT_symbol_ordering_file)){
1587     if (args.hasArg(OPT_call_graph_ordering_file))
1588       error("--symbol-ordering-file and --call-graph-order-file "
1589             "may not be used together");
1590     if (std::optional<MemoryBufferRef> buffer = readFile(arg->getValue())) {
1591       config->symbolOrderingFile = getSymbolOrderingFile(*buffer);
1592       // Also need to disable CallGraphProfileSort to prevent
1593       // LLD order symbols with CGProfile
1594       config->callGraphProfileSort = false;
1595     }
1596   }
1597 
1598   assert(config->versionDefinitions.empty());
1599   config->versionDefinitions.push_back(
1600       {"local", (uint16_t)VER_NDX_LOCAL, {}, {}});
1601   config->versionDefinitions.push_back(
1602       {"global", (uint16_t)VER_NDX_GLOBAL, {}, {}});
1603 
1604   // If --retain-symbol-file is used, we'll keep only the symbols listed in
1605   // the file and discard all others.
1606   if (auto *arg = args.getLastArg(OPT_retain_symbols_file)) {
1607     config->versionDefinitions[VER_NDX_LOCAL].nonLocalPatterns.push_back(
1608         {"*", /*isExternCpp=*/false, /*hasWildcard=*/true});
1609     if (std::optional<MemoryBufferRef> buffer = readFile(arg->getValue()))
1610       for (StringRef s : args::getLines(*buffer))
1611         config->versionDefinitions[VER_NDX_GLOBAL].nonLocalPatterns.push_back(
1612             {s, /*isExternCpp=*/false, /*hasWildcard=*/false});
1613   }
1614 
1615   for (opt::Arg *arg : args.filtered(OPT_warn_backrefs_exclude)) {
1616     StringRef pattern(arg->getValue());
1617     if (Expected<GlobPattern> pat = GlobPattern::create(pattern))
1618       config->warnBackrefsExclude.push_back(std::move(*pat));
1619     else
1620       error(arg->getSpelling() + ": " + toString(pat.takeError()));
1621   }
1622 
1623   // For -no-pie and -pie, --export-dynamic-symbol specifies defined symbols
1624   // which should be exported. For -shared, references to matched non-local
1625   // STV_DEFAULT symbols are not bound to definitions within the shared object,
1626   // even if other options express a symbolic intention: -Bsymbolic,
1627   // -Bsymbolic-functions (if STT_FUNC), --dynamic-list.
1628   for (auto *arg : args.filtered(OPT_export_dynamic_symbol))
1629     config->dynamicList.push_back(
1630         {arg->getValue(), /*isExternCpp=*/false,
1631          /*hasWildcard=*/hasWildcard(arg->getValue())});
1632 
1633   // --export-dynamic-symbol-list specifies a list of --export-dynamic-symbol
1634   // patterns. --dynamic-list is --export-dynamic-symbol-list plus -Bsymbolic
1635   // like semantics.
1636   config->symbolic =
1637       config->bsymbolic == BsymbolicKind::All || args.hasArg(OPT_dynamic_list);
1638   for (auto *arg :
1639        args.filtered(OPT_dynamic_list, OPT_export_dynamic_symbol_list))
1640     if (std::optional<MemoryBufferRef> buffer = readFile(arg->getValue()))
1641       readDynamicList(*buffer);
1642 
1643   for (auto *arg : args.filtered(OPT_version_script))
1644     if (std::optional<std::string> path = searchScript(arg->getValue())) {
1645       if (std::optional<MemoryBufferRef> buffer = readFile(*path))
1646         readVersionScript(*buffer);
1647     } else {
1648       error(Twine("cannot find version script ") + arg->getValue());
1649     }
1650 }
1651 
1652 // Some Config members do not directly correspond to any particular
1653 // command line options, but computed based on other Config values.
1654 // This function initialize such members. See Config.h for the details
1655 // of these values.
1656 static void setConfigs(opt::InputArgList &args) {
1657   ELFKind k = config->ekind;
1658   uint16_t m = config->emachine;
1659 
1660   config->copyRelocs = (config->relocatable || config->emitRelocs);
1661   config->is64 = (k == ELF64LEKind || k == ELF64BEKind);
1662   config->isLE = (k == ELF32LEKind || k == ELF64LEKind);
1663   config->endianness = config->isLE ? endianness::little : endianness::big;
1664   config->isMips64EL = (k == ELF64LEKind && m == EM_MIPS);
1665   config->isPic = config->pie || config->shared;
1666   config->picThunk = args.hasArg(OPT_pic_veneer, config->isPic);
1667   config->wordsize = config->is64 ? 8 : 4;
1668 
1669   // ELF defines two different ways to store relocation addends as shown below:
1670   //
1671   //  Rel: Addends are stored to the location where relocations are applied. It
1672   //  cannot pack the full range of addend values for all relocation types, but
1673   //  this only affects relocation types that we don't support emitting as
1674   //  dynamic relocations (see getDynRel).
1675   //  Rela: Addends are stored as part of relocation entry.
1676   //
1677   // In other words, Rela makes it easy to read addends at the price of extra
1678   // 4 or 8 byte for each relocation entry.
1679   //
1680   // We pick the format for dynamic relocations according to the psABI for each
1681   // processor, but a contrary choice can be made if the dynamic loader
1682   // supports.
1683   config->isRela = getIsRela(args);
1684 
1685   // If the output uses REL relocations we must store the dynamic relocation
1686   // addends to the output sections. We also store addends for RELA relocations
1687   // if --apply-dynamic-relocs is used.
1688   // We default to not writing the addends when using RELA relocations since
1689   // any standard conforming tool can find it in r_addend.
1690   config->writeAddends = args.hasFlag(OPT_apply_dynamic_relocs,
1691                                       OPT_no_apply_dynamic_relocs, false) ||
1692                          !config->isRela;
1693   // Validation of dynamic relocation addends is on by default for assertions
1694   // builds (for supported targets) and disabled otherwise. Ideally we would
1695   // enable the debug checks for all targets, but currently not all targets
1696   // have support for reading Elf_Rel addends, so we only enable for a subset.
1697 #ifndef NDEBUG
1698   bool checkDynamicRelocsDefault = m == EM_AARCH64 || m == EM_ARM ||
1699                                    m == EM_386 || m == EM_LOONGARCH ||
1700                                    m == EM_MIPS || m == EM_RISCV ||
1701                                    m == EM_X86_64;
1702 #else
1703   bool checkDynamicRelocsDefault = false;
1704 #endif
1705   config->checkDynamicRelocs =
1706       args.hasFlag(OPT_check_dynamic_relocations,
1707                    OPT_no_check_dynamic_relocations, checkDynamicRelocsDefault);
1708   config->tocOptimize =
1709       args.hasFlag(OPT_toc_optimize, OPT_no_toc_optimize, m == EM_PPC64);
1710   config->pcRelOptimize =
1711       args.hasFlag(OPT_pcrel_optimize, OPT_no_pcrel_optimize, m == EM_PPC64);
1712 }
1713 
1714 static bool isFormatBinary(StringRef s) {
1715   if (s == "binary")
1716     return true;
1717   if (s == "elf" || s == "default")
1718     return false;
1719   error("unknown --format value: " + s +
1720         " (supported formats: elf, default, binary)");
1721   return false;
1722 }
1723 
1724 void LinkerDriver::createFiles(opt::InputArgList &args) {
1725   llvm::TimeTraceScope timeScope("Load input files");
1726   // For --{push,pop}-state.
1727   std::vector<std::tuple<bool, bool, bool>> stack;
1728 
1729   // Iterate over argv to process input files and positional arguments.
1730   InputFile::isInGroup = false;
1731   bool hasInput = false;
1732   for (auto *arg : args) {
1733     switch (arg->getOption().getID()) {
1734     case OPT_library:
1735       addLibrary(arg->getValue());
1736       hasInput = true;
1737       break;
1738     case OPT_INPUT:
1739       addFile(arg->getValue(), /*withLOption=*/false);
1740       hasInput = true;
1741       break;
1742     case OPT_defsym: {
1743       StringRef from;
1744       StringRef to;
1745       std::tie(from, to) = StringRef(arg->getValue()).split('=');
1746       if (from.empty() || to.empty())
1747         error("--defsym: syntax error: " + StringRef(arg->getValue()));
1748       else
1749         readDefsym(from, MemoryBufferRef(to, "--defsym"));
1750       break;
1751     }
1752     case OPT_script:
1753       if (std::optional<std::string> path = searchScript(arg->getValue())) {
1754         if (std::optional<MemoryBufferRef> mb = readFile(*path))
1755           readLinkerScript(*mb);
1756         break;
1757       }
1758       error(Twine("cannot find linker script ") + arg->getValue());
1759       break;
1760     case OPT_as_needed:
1761       config->asNeeded = true;
1762       break;
1763     case OPT_format:
1764       config->formatBinary = isFormatBinary(arg->getValue());
1765       break;
1766     case OPT_no_as_needed:
1767       config->asNeeded = false;
1768       break;
1769     case OPT_Bstatic:
1770     case OPT_omagic:
1771     case OPT_nmagic:
1772       config->isStatic = true;
1773       break;
1774     case OPT_Bdynamic:
1775       config->isStatic = false;
1776       break;
1777     case OPT_whole_archive:
1778       inWholeArchive = true;
1779       break;
1780     case OPT_no_whole_archive:
1781       inWholeArchive = false;
1782       break;
1783     case OPT_just_symbols:
1784       if (std::optional<MemoryBufferRef> mb = readFile(arg->getValue())) {
1785         files.push_back(createObjFile(*mb));
1786         files.back()->justSymbols = true;
1787       }
1788       break;
1789     case OPT_in_implib:
1790       if (armCmseImpLib)
1791         error("multiple CMSE import libraries not supported");
1792       else if (std::optional<MemoryBufferRef> mb = readFile(arg->getValue()))
1793         armCmseImpLib = createObjFile(*mb);
1794       break;
1795     case OPT_start_group:
1796       if (InputFile::isInGroup)
1797         error("nested --start-group");
1798       InputFile::isInGroup = true;
1799       break;
1800     case OPT_end_group:
1801       if (!InputFile::isInGroup)
1802         error("stray --end-group");
1803       InputFile::isInGroup = false;
1804       ++InputFile::nextGroupId;
1805       break;
1806     case OPT_start_lib:
1807       if (inLib)
1808         error("nested --start-lib");
1809       if (InputFile::isInGroup)
1810         error("may not nest --start-lib in --start-group");
1811       inLib = true;
1812       InputFile::isInGroup = true;
1813       break;
1814     case OPT_end_lib:
1815       if (!inLib)
1816         error("stray --end-lib");
1817       inLib = false;
1818       InputFile::isInGroup = false;
1819       ++InputFile::nextGroupId;
1820       break;
1821     case OPT_push_state:
1822       stack.emplace_back(config->asNeeded, config->isStatic, inWholeArchive);
1823       break;
1824     case OPT_pop_state:
1825       if (stack.empty()) {
1826         error("unbalanced --push-state/--pop-state");
1827         break;
1828       }
1829       std::tie(config->asNeeded, config->isStatic, inWholeArchive) = stack.back();
1830       stack.pop_back();
1831       break;
1832     }
1833   }
1834 
1835   if (files.empty() && !hasInput && errorCount() == 0)
1836     error("no input files");
1837 }
1838 
1839 // If -m <machine_type> was not given, infer it from object files.
1840 void LinkerDriver::inferMachineType() {
1841   if (config->ekind != ELFNoneKind)
1842     return;
1843 
1844   for (InputFile *f : files) {
1845     if (f->ekind == ELFNoneKind)
1846       continue;
1847     config->ekind = f->ekind;
1848     config->emachine = f->emachine;
1849     config->osabi = f->osabi;
1850     config->mipsN32Abi = config->emachine == EM_MIPS && isMipsN32Abi(f);
1851     return;
1852   }
1853   error("target emulation unknown: -m or at least one .o file required");
1854 }
1855 
1856 // Parse -z max-page-size=<value>. The default value is defined by
1857 // each target.
1858 static uint64_t getMaxPageSize(opt::InputArgList &args) {
1859   uint64_t val = args::getZOptionValue(args, OPT_z, "max-page-size",
1860                                        target->defaultMaxPageSize);
1861   if (!isPowerOf2_64(val)) {
1862     error("max-page-size: value isn't a power of 2");
1863     return target->defaultMaxPageSize;
1864   }
1865   if (config->nmagic || config->omagic) {
1866     if (val != target->defaultMaxPageSize)
1867       warn("-z max-page-size set, but paging disabled by omagic or nmagic");
1868     return 1;
1869   }
1870   return val;
1871 }
1872 
1873 // Parse -z common-page-size=<value>. The default value is defined by
1874 // each target.
1875 static uint64_t getCommonPageSize(opt::InputArgList &args) {
1876   uint64_t val = args::getZOptionValue(args, OPT_z, "common-page-size",
1877                                        target->defaultCommonPageSize);
1878   if (!isPowerOf2_64(val)) {
1879     error("common-page-size: value isn't a power of 2");
1880     return target->defaultCommonPageSize;
1881   }
1882   if (config->nmagic || config->omagic) {
1883     if (val != target->defaultCommonPageSize)
1884       warn("-z common-page-size set, but paging disabled by omagic or nmagic");
1885     return 1;
1886   }
1887   // commonPageSize can't be larger than maxPageSize.
1888   if (val > config->maxPageSize)
1889     val = config->maxPageSize;
1890   return val;
1891 }
1892 
1893 // Parses --image-base option.
1894 static std::optional<uint64_t> getImageBase(opt::InputArgList &args) {
1895   // Because we are using "Config->maxPageSize" here, this function has to be
1896   // called after the variable is initialized.
1897   auto *arg = args.getLastArg(OPT_image_base);
1898   if (!arg)
1899     return std::nullopt;
1900 
1901   StringRef s = arg->getValue();
1902   uint64_t v;
1903   if (!to_integer(s, v)) {
1904     error("--image-base: number expected, but got " + s);
1905     return 0;
1906   }
1907   if ((v % config->maxPageSize) != 0)
1908     warn("--image-base: address isn't multiple of page size: " + s);
1909   return v;
1910 }
1911 
1912 // Parses `--exclude-libs=lib,lib,...`.
1913 // The library names may be delimited by commas or colons.
1914 static DenseSet<StringRef> getExcludeLibs(opt::InputArgList &args) {
1915   DenseSet<StringRef> ret;
1916   for (auto *arg : args.filtered(OPT_exclude_libs)) {
1917     StringRef s = arg->getValue();
1918     for (;;) {
1919       size_t pos = s.find_first_of(",:");
1920       if (pos == StringRef::npos)
1921         break;
1922       ret.insert(s.substr(0, pos));
1923       s = s.substr(pos + 1);
1924     }
1925     ret.insert(s);
1926   }
1927   return ret;
1928 }
1929 
1930 // Handles the --exclude-libs option. If a static library file is specified
1931 // by the --exclude-libs option, all public symbols from the archive become
1932 // private unless otherwise specified by version scripts or something.
1933 // A special library name "ALL" means all archive files.
1934 //
1935 // This is not a popular option, but some programs such as bionic libc use it.
1936 static void excludeLibs(opt::InputArgList &args) {
1937   DenseSet<StringRef> libs = getExcludeLibs(args);
1938   bool all = libs.count("ALL");
1939 
1940   auto visit = [&](InputFile *file) {
1941     if (file->archiveName.empty() ||
1942         !(all || libs.count(path::filename(file->archiveName))))
1943       return;
1944     ArrayRef<Symbol *> symbols = file->getSymbols();
1945     if (isa<ELFFileBase>(file))
1946       symbols = cast<ELFFileBase>(file)->getGlobalSymbols();
1947     for (Symbol *sym : symbols)
1948       if (!sym->isUndefined() && sym->file == file)
1949         sym->versionId = VER_NDX_LOCAL;
1950   };
1951 
1952   for (ELFFileBase *file : ctx.objectFiles)
1953     visit(file);
1954 
1955   for (BitcodeFile *file : ctx.bitcodeFiles)
1956     visit(file);
1957 }
1958 
1959 // Force Sym to be entered in the output.
1960 static void handleUndefined(Symbol *sym, const char *option) {
1961   // Since a symbol may not be used inside the program, LTO may
1962   // eliminate it. Mark the symbol as "used" to prevent it.
1963   sym->isUsedInRegularObj = true;
1964 
1965   if (!sym->isLazy())
1966     return;
1967   sym->extract();
1968   if (!config->whyExtract.empty())
1969     ctx.whyExtractRecords.emplace_back(option, sym->file, *sym);
1970 }
1971 
1972 // As an extension to GNU linkers, lld supports a variant of `-u`
1973 // which accepts wildcard patterns. All symbols that match a given
1974 // pattern are handled as if they were given by `-u`.
1975 static void handleUndefinedGlob(StringRef arg) {
1976   Expected<GlobPattern> pat = GlobPattern::create(arg);
1977   if (!pat) {
1978     error("--undefined-glob: " + toString(pat.takeError()));
1979     return;
1980   }
1981 
1982   // Calling sym->extract() in the loop is not safe because it may add new
1983   // symbols to the symbol table, invalidating the current iterator.
1984   SmallVector<Symbol *, 0> syms;
1985   for (Symbol *sym : symtab.getSymbols())
1986     if (!sym->isPlaceholder() && pat->match(sym->getName()))
1987       syms.push_back(sym);
1988 
1989   for (Symbol *sym : syms)
1990     handleUndefined(sym, "--undefined-glob");
1991 }
1992 
1993 static void handleLibcall(StringRef name) {
1994   Symbol *sym = symtab.find(name);
1995   if (!sym || !sym->isLazy())
1996     return;
1997 
1998   MemoryBufferRef mb;
1999   mb = cast<LazyObject>(sym)->file->mb;
2000 
2001   if (isBitcode(mb))
2002     sym->extract();
2003 }
2004 
2005 static void writeArchiveStats() {
2006   if (config->printArchiveStats.empty())
2007     return;
2008 
2009   std::error_code ec;
2010   raw_fd_ostream os = ctx.openAuxiliaryFile(config->printArchiveStats, ec);
2011   if (ec) {
2012     error("--print-archive-stats=: cannot open " + config->printArchiveStats +
2013           ": " + ec.message());
2014     return;
2015   }
2016 
2017   os << "members\textracted\tarchive\n";
2018 
2019   SmallVector<StringRef, 0> archives;
2020   DenseMap<CachedHashStringRef, unsigned> all, extracted;
2021   for (ELFFileBase *file : ctx.objectFiles)
2022     if (file->archiveName.size())
2023       ++extracted[CachedHashStringRef(file->archiveName)];
2024   for (BitcodeFile *file : ctx.bitcodeFiles)
2025     if (file->archiveName.size())
2026       ++extracted[CachedHashStringRef(file->archiveName)];
2027   for (std::pair<StringRef, unsigned> f : ctx.driver.archiveFiles) {
2028     unsigned &v = extracted[CachedHashString(f.first)];
2029     os << f.second << '\t' << v << '\t' << f.first << '\n';
2030     // If the archive occurs multiple times, other instances have a count of 0.
2031     v = 0;
2032   }
2033 }
2034 
2035 static void writeWhyExtract() {
2036   if (config->whyExtract.empty())
2037     return;
2038 
2039   std::error_code ec;
2040   raw_fd_ostream os = ctx.openAuxiliaryFile(config->whyExtract, ec);
2041   if (ec) {
2042     error("cannot open --why-extract= file " + config->whyExtract + ": " +
2043           ec.message());
2044     return;
2045   }
2046 
2047   os << "reference\textracted\tsymbol\n";
2048   for (auto &entry : ctx.whyExtractRecords) {
2049     os << std::get<0>(entry) << '\t' << toString(std::get<1>(entry)) << '\t'
2050        << toString(std::get<2>(entry)) << '\n';
2051   }
2052 }
2053 
2054 static void reportBackrefs() {
2055   for (auto &ref : ctx.backwardReferences) {
2056     const Symbol &sym = *ref.first;
2057     std::string to = toString(ref.second.second);
2058     // Some libraries have known problems and can cause noise. Filter them out
2059     // with --warn-backrefs-exclude=. The value may look like (for --start-lib)
2060     // *.o or (archive member) *.a(*.o).
2061     bool exclude = false;
2062     for (const llvm::GlobPattern &pat : config->warnBackrefsExclude)
2063       if (pat.match(to)) {
2064         exclude = true;
2065         break;
2066       }
2067     if (!exclude)
2068       warn("backward reference detected: " + sym.getName() + " in " +
2069            toString(ref.second.first) + " refers to " + to);
2070   }
2071 }
2072 
2073 // Handle --dependency-file=<path>. If that option is given, lld creates a
2074 // file at a given path with the following contents:
2075 //
2076 //   <output-file>: <input-file> ...
2077 //
2078 //   <input-file>:
2079 //
2080 // where <output-file> is a pathname of an output file and <input-file>
2081 // ... is a list of pathnames of all input files. `make` command can read a
2082 // file in the above format and interpret it as a dependency info. We write
2083 // phony targets for every <input-file> to avoid an error when that file is
2084 // removed.
2085 //
2086 // This option is useful if you want to make your final executable to depend
2087 // on all input files including system libraries. Here is why.
2088 //
2089 // When you write a Makefile, you usually write it so that the final
2090 // executable depends on all user-generated object files. Normally, you
2091 // don't make your executable to depend on system libraries (such as libc)
2092 // because you don't know the exact paths of libraries, even though system
2093 // libraries that are linked to your executable statically are technically a
2094 // part of your program. By using --dependency-file option, you can make
2095 // lld to dump dependency info so that you can maintain exact dependencies
2096 // easily.
2097 static void writeDependencyFile() {
2098   std::error_code ec;
2099   raw_fd_ostream os = ctx.openAuxiliaryFile(config->dependencyFile, ec);
2100   if (ec) {
2101     error("cannot open " + config->dependencyFile + ": " + ec.message());
2102     return;
2103   }
2104 
2105   // We use the same escape rules as Clang/GCC which are accepted by Make/Ninja:
2106   // * A space is escaped by a backslash which itself must be escaped.
2107   // * A hash sign is escaped by a single backslash.
2108   // * $ is escapes as $$.
2109   auto printFilename = [](raw_fd_ostream &os, StringRef filename) {
2110     llvm::SmallString<256> nativePath;
2111     llvm::sys::path::native(filename.str(), nativePath);
2112     llvm::sys::path::remove_dots(nativePath, /*remove_dot_dot=*/true);
2113     for (unsigned i = 0, e = nativePath.size(); i != e; ++i) {
2114       if (nativePath[i] == '#') {
2115         os << '\\';
2116       } else if (nativePath[i] == ' ') {
2117         os << '\\';
2118         unsigned j = i;
2119         while (j > 0 && nativePath[--j] == '\\')
2120           os << '\\';
2121       } else if (nativePath[i] == '$') {
2122         os << '$';
2123       }
2124       os << nativePath[i];
2125     }
2126   };
2127 
2128   os << config->outputFile << ":";
2129   for (StringRef path : config->dependencyFiles) {
2130     os << " \\\n ";
2131     printFilename(os, path);
2132   }
2133   os << "\n";
2134 
2135   for (StringRef path : config->dependencyFiles) {
2136     os << "\n";
2137     printFilename(os, path);
2138     os << ":\n";
2139   }
2140 }
2141 
2142 // Replaces common symbols with defined symbols reside in .bss sections.
2143 // This function is called after all symbol names are resolved. As a
2144 // result, the passes after the symbol resolution won't see any
2145 // symbols of type CommonSymbol.
2146 static void replaceCommonSymbols() {
2147   llvm::TimeTraceScope timeScope("Replace common symbols");
2148   for (ELFFileBase *file : ctx.objectFiles) {
2149     if (!file->hasCommonSyms)
2150       continue;
2151     for (Symbol *sym : file->getGlobalSymbols()) {
2152       auto *s = dyn_cast<CommonSymbol>(sym);
2153       if (!s)
2154         continue;
2155 
2156       auto *bss = make<BssSection>("COMMON", s->size, s->alignment);
2157       bss->file = s->file;
2158       ctx.inputSections.push_back(bss);
2159       Defined(s->file, StringRef(), s->binding, s->stOther, s->type,
2160               /*value=*/0, s->size, bss)
2161           .overwrite(*s);
2162     }
2163   }
2164 }
2165 
2166 // If all references to a DSO happen to be weak, the DSO is not added to
2167 // DT_NEEDED. If that happens, replace ShardSymbol with Undefined to avoid
2168 // dangling references to an unneeded DSO. Use a weak binding to avoid
2169 // --no-allow-shlib-undefined diagnostics. Similarly, demote lazy symbols.
2170 static void demoteSharedAndLazySymbols() {
2171   llvm::TimeTraceScope timeScope("Demote shared and lazy symbols");
2172   for (Symbol *sym : symtab.getSymbols()) {
2173     auto *s = dyn_cast<SharedSymbol>(sym);
2174     if (!(s && !cast<SharedFile>(s->file)->isNeeded) && !sym->isLazy())
2175       continue;
2176 
2177     uint8_t binding = sym->isLazy() ? sym->binding : uint8_t(STB_WEAK);
2178     Undefined(nullptr, sym->getName(), binding, sym->stOther, sym->type)
2179         .overwrite(*sym);
2180     sym->versionId = VER_NDX_GLOBAL;
2181   }
2182 }
2183 
2184 // The section referred to by `s` is considered address-significant. Set the
2185 // keepUnique flag on the section if appropriate.
2186 static void markAddrsig(Symbol *s) {
2187   if (auto *d = dyn_cast_or_null<Defined>(s))
2188     if (d->section)
2189       // We don't need to keep text sections unique under --icf=all even if they
2190       // are address-significant.
2191       if (config->icf == ICFLevel::Safe || !(d->section->flags & SHF_EXECINSTR))
2192         d->section->keepUnique = true;
2193 }
2194 
2195 // Record sections that define symbols mentioned in --keep-unique <symbol>
2196 // and symbols referred to by address-significance tables. These sections are
2197 // ineligible for ICF.
2198 template <class ELFT>
2199 static void findKeepUniqueSections(opt::InputArgList &args) {
2200   for (auto *arg : args.filtered(OPT_keep_unique)) {
2201     StringRef name = arg->getValue();
2202     auto *d = dyn_cast_or_null<Defined>(symtab.find(name));
2203     if (!d || !d->section) {
2204       warn("could not find symbol " + name + " to keep unique");
2205       continue;
2206     }
2207     d->section->keepUnique = true;
2208   }
2209 
2210   // --icf=all --ignore-data-address-equality means that we can ignore
2211   // the dynsym and address-significance tables entirely.
2212   if (config->icf == ICFLevel::All && config->ignoreDataAddressEquality)
2213     return;
2214 
2215   // Symbols in the dynsym could be address-significant in other executables
2216   // or DSOs, so we conservatively mark them as address-significant.
2217   for (Symbol *sym : symtab.getSymbols())
2218     if (sym->includeInDynsym())
2219       markAddrsig(sym);
2220 
2221   // Visit the address-significance table in each object file and mark each
2222   // referenced symbol as address-significant.
2223   for (InputFile *f : ctx.objectFiles) {
2224     auto *obj = cast<ObjFile<ELFT>>(f);
2225     ArrayRef<Symbol *> syms = obj->getSymbols();
2226     if (obj->addrsigSec) {
2227       ArrayRef<uint8_t> contents =
2228           check(obj->getObj().getSectionContents(*obj->addrsigSec));
2229       const uint8_t *cur = contents.begin();
2230       while (cur != contents.end()) {
2231         unsigned size;
2232         const char *err;
2233         uint64_t symIndex = decodeULEB128(cur, &size, contents.end(), &err);
2234         if (err)
2235           fatal(toString(f) + ": could not decode addrsig section: " + err);
2236         markAddrsig(syms[symIndex]);
2237         cur += size;
2238       }
2239     } else {
2240       // If an object file does not have an address-significance table,
2241       // conservatively mark all of its symbols as address-significant.
2242       for (Symbol *s : syms)
2243         markAddrsig(s);
2244     }
2245   }
2246 }
2247 
2248 // This function reads a symbol partition specification section. These sections
2249 // are used to control which partition a symbol is allocated to. See
2250 // https://lld.llvm.org/Partitions.html for more details on partitions.
2251 template <typename ELFT>
2252 static void readSymbolPartitionSection(InputSectionBase *s) {
2253   // Read the relocation that refers to the partition's entry point symbol.
2254   Symbol *sym;
2255   const RelsOrRelas<ELFT> rels = s->template relsOrRelas<ELFT>();
2256   if (rels.areRelocsRel())
2257     sym = &s->getFile<ELFT>()->getRelocTargetSym(rels.rels[0]);
2258   else
2259     sym = &s->getFile<ELFT>()->getRelocTargetSym(rels.relas[0]);
2260   if (!isa<Defined>(sym) || !sym->includeInDynsym())
2261     return;
2262 
2263   StringRef partName = reinterpret_cast<const char *>(s->content().data());
2264   for (Partition &part : partitions) {
2265     if (part.name == partName) {
2266       sym->partition = part.getNumber();
2267       return;
2268     }
2269   }
2270 
2271   // Forbid partitions from being used on incompatible targets, and forbid them
2272   // from being used together with various linker features that assume a single
2273   // set of output sections.
2274   if (script->hasSectionsCommand)
2275     error(toString(s->file) +
2276           ": partitions cannot be used with the SECTIONS command");
2277   if (script->hasPhdrsCommands())
2278     error(toString(s->file) +
2279           ": partitions cannot be used with the PHDRS command");
2280   if (!config->sectionStartMap.empty())
2281     error(toString(s->file) + ": partitions cannot be used with "
2282                               "--section-start, -Ttext, -Tdata or -Tbss");
2283   if (config->emachine == EM_MIPS)
2284     error(toString(s->file) + ": partitions cannot be used on this target");
2285 
2286   // Impose a limit of no more than 254 partitions. This limit comes from the
2287   // sizes of the Partition fields in InputSectionBase and Symbol, as well as
2288   // the amount of space devoted to the partition number in RankFlags.
2289   if (partitions.size() == 254)
2290     fatal("may not have more than 254 partitions");
2291 
2292   partitions.emplace_back();
2293   Partition &newPart = partitions.back();
2294   newPart.name = partName;
2295   sym->partition = newPart.getNumber();
2296 }
2297 
2298 static Symbol *addUnusedUndefined(StringRef name,
2299                                   uint8_t binding = STB_GLOBAL) {
2300   return symtab.addSymbol(Undefined{nullptr, name, binding, STV_DEFAULT, 0});
2301 }
2302 
2303 static void markBuffersAsDontNeed(bool skipLinkedOutput) {
2304   // With --thinlto-index-only, all buffers are nearly unused from now on
2305   // (except symbol/section names used by infrequent passes). Mark input file
2306   // buffers as MADV_DONTNEED so that these pages can be reused by the expensive
2307   // thin link, saving memory.
2308   if (skipLinkedOutput) {
2309     for (MemoryBuffer &mb : llvm::make_pointee_range(ctx.memoryBuffers))
2310       mb.dontNeedIfMmap();
2311     return;
2312   }
2313 
2314   // Otherwise, just mark MemoryBuffers backing BitcodeFiles.
2315   DenseSet<const char *> bufs;
2316   for (BitcodeFile *file : ctx.bitcodeFiles)
2317     bufs.insert(file->mb.getBufferStart());
2318   for (BitcodeFile *file : ctx.lazyBitcodeFiles)
2319     bufs.insert(file->mb.getBufferStart());
2320   for (MemoryBuffer &mb : llvm::make_pointee_range(ctx.memoryBuffers))
2321     if (bufs.count(mb.getBufferStart()))
2322       mb.dontNeedIfMmap();
2323 }
2324 
2325 // This function is where all the optimizations of link-time
2326 // optimization takes place. When LTO is in use, some input files are
2327 // not in native object file format but in the LLVM bitcode format.
2328 // This function compiles bitcode files into a few big native files
2329 // using LLVM functions and replaces bitcode symbols with the results.
2330 // Because all bitcode files that the program consists of are passed to
2331 // the compiler at once, it can do a whole-program optimization.
2332 template <class ELFT>
2333 void LinkerDriver::compileBitcodeFiles(bool skipLinkedOutput) {
2334   llvm::TimeTraceScope timeScope("LTO");
2335   // Compile bitcode files and replace bitcode symbols.
2336   lto.reset(new BitcodeCompiler);
2337   for (BitcodeFile *file : ctx.bitcodeFiles)
2338     lto->add(*file);
2339 
2340   if (!ctx.bitcodeFiles.empty())
2341     markBuffersAsDontNeed(skipLinkedOutput);
2342 
2343   for (InputFile *file : lto->compile()) {
2344     auto *obj = cast<ObjFile<ELFT>>(file);
2345     obj->parse(/*ignoreComdats=*/true);
2346 
2347     // Parse '@' in symbol names for non-relocatable output.
2348     if (!config->relocatable)
2349       for (Symbol *sym : obj->getGlobalSymbols())
2350         if (sym->hasVersionSuffix)
2351           sym->parseSymbolVersion();
2352     ctx.objectFiles.push_back(obj);
2353   }
2354 }
2355 
2356 // The --wrap option is a feature to rename symbols so that you can write
2357 // wrappers for existing functions. If you pass `--wrap=foo`, all
2358 // occurrences of symbol `foo` are resolved to `__wrap_foo` (so, you are
2359 // expected to write `__wrap_foo` function as a wrapper). The original
2360 // symbol becomes accessible as `__real_foo`, so you can call that from your
2361 // wrapper.
2362 //
2363 // This data structure is instantiated for each --wrap option.
2364 struct WrappedSymbol {
2365   Symbol *sym;
2366   Symbol *real;
2367   Symbol *wrap;
2368 };
2369 
2370 // Handles --wrap option.
2371 //
2372 // This function instantiates wrapper symbols. At this point, they seem
2373 // like they are not being used at all, so we explicitly set some flags so
2374 // that LTO won't eliminate them.
2375 static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList &args) {
2376   std::vector<WrappedSymbol> v;
2377   DenseSet<StringRef> seen;
2378 
2379   for (auto *arg : args.filtered(OPT_wrap)) {
2380     StringRef name = arg->getValue();
2381     if (!seen.insert(name).second)
2382       continue;
2383 
2384     Symbol *sym = symtab.find(name);
2385     if (!sym)
2386       continue;
2387 
2388     Symbol *wrap =
2389         addUnusedUndefined(saver().save("__wrap_" + name), sym->binding);
2390 
2391     // If __real_ is referenced, pull in the symbol if it is lazy. Do this after
2392     // processing __wrap_ as that may have referenced __real_.
2393     StringRef realName = saver().save("__real_" + name);
2394     if (symtab.find(realName))
2395       addUnusedUndefined(name, sym->binding);
2396 
2397     Symbol *real = addUnusedUndefined(realName);
2398     v.push_back({sym, real, wrap});
2399 
2400     // We want to tell LTO not to inline symbols to be overwritten
2401     // because LTO doesn't know the final symbol contents after renaming.
2402     real->scriptDefined = true;
2403     sym->scriptDefined = true;
2404 
2405     // If a symbol is referenced in any object file, bitcode file or shared
2406     // object, mark its redirection target (foo for __real_foo and __wrap_foo
2407     // for foo) as referenced after redirection, which will be used to tell LTO
2408     // to not eliminate the redirection target. If the object file defining the
2409     // symbol also references it, we cannot easily distinguish the case from
2410     // cases where the symbol is not referenced. Retain the redirection target
2411     // in this case because we choose to wrap symbol references regardless of
2412     // whether the symbol is defined
2413     // (https://sourceware.org/bugzilla/show_bug.cgi?id=26358).
2414     if (real->referenced || real->isDefined())
2415       sym->referencedAfterWrap = true;
2416     if (sym->referenced || sym->isDefined())
2417       wrap->referencedAfterWrap = true;
2418   }
2419   return v;
2420 }
2421 
2422 static void combineVersionedSymbol(Symbol &sym,
2423                                    DenseMap<Symbol *, Symbol *> &map) {
2424   const char *suffix1 = sym.getVersionSuffix();
2425   if (suffix1[0] != '@' || suffix1[1] == '@')
2426     return;
2427 
2428   // Check the existing symbol foo. We have two special cases to handle:
2429   //
2430   // * There is a definition of foo@v1 and foo@@v1.
2431   // * There is a definition of foo@v1 and foo.
2432   Defined *sym2 = dyn_cast_or_null<Defined>(symtab.find(sym.getName()));
2433   if (!sym2)
2434     return;
2435   const char *suffix2 = sym2->getVersionSuffix();
2436   if (suffix2[0] == '@' && suffix2[1] == '@' &&
2437       strcmp(suffix1 + 1, suffix2 + 2) == 0) {
2438     // foo@v1 and foo@@v1 should be merged, so redirect foo@v1 to foo@@v1.
2439     map.try_emplace(&sym, sym2);
2440     // If both foo@v1 and foo@@v1 are defined and non-weak, report a
2441     // duplicate definition error.
2442     if (sym.isDefined()) {
2443       sym2->checkDuplicate(cast<Defined>(sym));
2444       sym2->resolve(cast<Defined>(sym));
2445     } else if (sym.isUndefined()) {
2446       sym2->resolve(cast<Undefined>(sym));
2447     } else {
2448       sym2->resolve(cast<SharedSymbol>(sym));
2449     }
2450     // Eliminate foo@v1 from the symbol table.
2451     sym.symbolKind = Symbol::PlaceholderKind;
2452     sym.isUsedInRegularObj = false;
2453   } else if (auto *sym1 = dyn_cast<Defined>(&sym)) {
2454     if (sym2->versionId > VER_NDX_GLOBAL
2455             ? config->versionDefinitions[sym2->versionId].name == suffix1 + 1
2456             : sym1->section == sym2->section && sym1->value == sym2->value) {
2457       // Due to an assembler design flaw, if foo is defined, .symver foo,
2458       // foo@v1 defines both foo and foo@v1. Unless foo is bound to a
2459       // different version, GNU ld makes foo@v1 canonical and eliminates
2460       // foo. Emulate its behavior, otherwise we would have foo or foo@@v1
2461       // beside foo@v1. foo@v1 and foo combining does not apply if they are
2462       // not defined in the same place.
2463       map.try_emplace(sym2, &sym);
2464       sym2->symbolKind = Symbol::PlaceholderKind;
2465       sym2->isUsedInRegularObj = false;
2466     }
2467   }
2468 }
2469 
2470 // Do renaming for --wrap and foo@v1 by updating pointers to symbols.
2471 //
2472 // When this function is executed, only InputFiles and symbol table
2473 // contain pointers to symbol objects. We visit them to replace pointers,
2474 // so that wrapped symbols are swapped as instructed by the command line.
2475 static void redirectSymbols(ArrayRef<WrappedSymbol> wrapped) {
2476   llvm::TimeTraceScope timeScope("Redirect symbols");
2477   DenseMap<Symbol *, Symbol *> map;
2478   for (const WrappedSymbol &w : wrapped) {
2479     map[w.sym] = w.wrap;
2480     map[w.real] = w.sym;
2481   }
2482 
2483   // If there are version definitions (versionDefinitions.size() > 2), enumerate
2484   // symbols with a non-default version (foo@v1) and check whether it should be
2485   // combined with foo or foo@@v1.
2486   if (config->versionDefinitions.size() > 2)
2487     for (Symbol *sym : symtab.getSymbols())
2488       if (sym->hasVersionSuffix)
2489         combineVersionedSymbol(*sym, map);
2490 
2491   if (map.empty())
2492     return;
2493 
2494   // Update pointers in input files.
2495   parallelForEach(ctx.objectFiles, [&](ELFFileBase *file) {
2496     for (Symbol *&sym : file->getMutableGlobalSymbols())
2497       if (Symbol *s = map.lookup(sym))
2498         sym = s;
2499   });
2500 
2501   // Update pointers in the symbol table.
2502   for (const WrappedSymbol &w : wrapped)
2503     symtab.wrap(w.sym, w.real, w.wrap);
2504 }
2505 
2506 static void checkAndReportMissingFeature(StringRef config, uint32_t features,
2507                                          uint32_t mask, const Twine &report) {
2508   if (!(features & mask)) {
2509     if (config == "error")
2510       error(report);
2511     else if (config == "warning")
2512       warn(report);
2513   }
2514 }
2515 
2516 // To enable CET (x86's hardware-assisted control flow enforcement), each
2517 // source file must be compiled with -fcf-protection. Object files compiled
2518 // with the flag contain feature flags indicating that they are compatible
2519 // with CET. We enable the feature only when all object files are compatible
2520 // with CET.
2521 //
2522 // This is also the case with AARCH64's BTI and PAC which use the similar
2523 // GNU_PROPERTY_AARCH64_FEATURE_1_AND mechanism.
2524 static uint32_t getAndFeatures() {
2525   if (config->emachine != EM_386 && config->emachine != EM_X86_64 &&
2526       config->emachine != EM_AARCH64)
2527     return 0;
2528 
2529   uint32_t ret = -1;
2530   for (ELFFileBase *f : ctx.objectFiles) {
2531     uint32_t features = f->andFeatures;
2532 
2533     checkAndReportMissingFeature(
2534         config->zBtiReport, features, GNU_PROPERTY_AARCH64_FEATURE_1_BTI,
2535         toString(f) + ": -z bti-report: file does not have "
2536                       "GNU_PROPERTY_AARCH64_FEATURE_1_BTI property");
2537 
2538     checkAndReportMissingFeature(
2539         config->zCetReport, features, GNU_PROPERTY_X86_FEATURE_1_IBT,
2540         toString(f) + ": -z cet-report: file does not have "
2541                       "GNU_PROPERTY_X86_FEATURE_1_IBT property");
2542 
2543     checkAndReportMissingFeature(
2544         config->zCetReport, features, GNU_PROPERTY_X86_FEATURE_1_SHSTK,
2545         toString(f) + ": -z cet-report: file does not have "
2546                       "GNU_PROPERTY_X86_FEATURE_1_SHSTK property");
2547 
2548     if (config->zForceBti && !(features & GNU_PROPERTY_AARCH64_FEATURE_1_BTI)) {
2549       features |= GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
2550       if (config->zBtiReport == "none")
2551         warn(toString(f) + ": -z force-bti: file does not have "
2552                            "GNU_PROPERTY_AARCH64_FEATURE_1_BTI property");
2553     } else if (config->zForceIbt &&
2554                !(features & GNU_PROPERTY_X86_FEATURE_1_IBT)) {
2555       if (config->zCetReport == "none")
2556         warn(toString(f) + ": -z force-ibt: file does not have "
2557                            "GNU_PROPERTY_X86_FEATURE_1_IBT property");
2558       features |= GNU_PROPERTY_X86_FEATURE_1_IBT;
2559     }
2560     if (config->zPacPlt && !(features & GNU_PROPERTY_AARCH64_FEATURE_1_PAC)) {
2561       warn(toString(f) + ": -z pac-plt: file does not have "
2562                          "GNU_PROPERTY_AARCH64_FEATURE_1_PAC property");
2563       features |= GNU_PROPERTY_AARCH64_FEATURE_1_PAC;
2564     }
2565     ret &= features;
2566   }
2567 
2568   // Force enable Shadow Stack.
2569   if (config->zShstk)
2570     ret |= GNU_PROPERTY_X86_FEATURE_1_SHSTK;
2571 
2572   return ret;
2573 }
2574 
2575 static void initSectionsAndLocalSyms(ELFFileBase *file, bool ignoreComdats) {
2576   switch (file->ekind) {
2577   case ELF32LEKind:
2578     cast<ObjFile<ELF32LE>>(file)->initSectionsAndLocalSyms(ignoreComdats);
2579     break;
2580   case ELF32BEKind:
2581     cast<ObjFile<ELF32BE>>(file)->initSectionsAndLocalSyms(ignoreComdats);
2582     break;
2583   case ELF64LEKind:
2584     cast<ObjFile<ELF64LE>>(file)->initSectionsAndLocalSyms(ignoreComdats);
2585     break;
2586   case ELF64BEKind:
2587     cast<ObjFile<ELF64BE>>(file)->initSectionsAndLocalSyms(ignoreComdats);
2588     break;
2589   default:
2590     llvm_unreachable("");
2591   }
2592 }
2593 
2594 static void postParseObjectFile(ELFFileBase *file) {
2595   switch (file->ekind) {
2596   case ELF32LEKind:
2597     cast<ObjFile<ELF32LE>>(file)->postParse();
2598     break;
2599   case ELF32BEKind:
2600     cast<ObjFile<ELF32BE>>(file)->postParse();
2601     break;
2602   case ELF64LEKind:
2603     cast<ObjFile<ELF64LE>>(file)->postParse();
2604     break;
2605   case ELF64BEKind:
2606     cast<ObjFile<ELF64BE>>(file)->postParse();
2607     break;
2608   default:
2609     llvm_unreachable("");
2610   }
2611 }
2612 
2613 // Do actual linking. Note that when this function is called,
2614 // all linker scripts have already been parsed.
2615 void LinkerDriver::link(opt::InputArgList &args) {
2616   llvm::TimeTraceScope timeScope("Link", StringRef("LinkerDriver::Link"));
2617   // If a --hash-style option was not given, set to a default value,
2618   // which varies depending on the target.
2619   if (!args.hasArg(OPT_hash_style)) {
2620     if (config->emachine == EM_MIPS)
2621       config->sysvHash = true;
2622     else
2623       config->sysvHash = config->gnuHash = true;
2624   }
2625 
2626   // Default output filename is "a.out" by the Unix tradition.
2627   if (config->outputFile.empty())
2628     config->outputFile = "a.out";
2629 
2630   // Fail early if the output file or map file is not writable. If a user has a
2631   // long link, e.g. due to a large LTO link, they do not wish to run it and
2632   // find that it failed because there was a mistake in their command-line.
2633   {
2634     llvm::TimeTraceScope timeScope("Create output files");
2635     if (auto e = tryCreateFile(config->outputFile))
2636       error("cannot open output file " + config->outputFile + ": " +
2637             e.message());
2638     if (auto e = tryCreateFile(config->mapFile))
2639       error("cannot open map file " + config->mapFile + ": " + e.message());
2640     if (auto e = tryCreateFile(config->whyExtract))
2641       error("cannot open --why-extract= file " + config->whyExtract + ": " +
2642             e.message());
2643   }
2644   if (errorCount())
2645     return;
2646 
2647   // Use default entry point name if no name was given via the command
2648   // line nor linker scripts. For some reason, MIPS entry point name is
2649   // different from others.
2650   config->warnMissingEntry =
2651       (!config->entry.empty() || (!config->shared && !config->relocatable));
2652   if (config->entry.empty() && !config->relocatable)
2653     config->entry = (config->emachine == EM_MIPS) ? "__start" : "_start";
2654 
2655   // Handle --trace-symbol.
2656   for (auto *arg : args.filtered(OPT_trace_symbol))
2657     symtab.insert(arg->getValue())->traced = true;
2658 
2659   // Handle -u/--undefined before input files. If both a.a and b.so define foo,
2660   // -u foo a.a b.so will extract a.a.
2661   for (StringRef name : config->undefined)
2662     addUnusedUndefined(name)->referenced = true;
2663 
2664   // Add all files to the symbol table. This will add almost all
2665   // symbols that we need to the symbol table. This process might
2666   // add files to the link, via autolinking, these files are always
2667   // appended to the Files vector.
2668   {
2669     llvm::TimeTraceScope timeScope("Parse input files");
2670     for (size_t i = 0; i < files.size(); ++i) {
2671       llvm::TimeTraceScope timeScope("Parse input files", files[i]->getName());
2672       parseFile(files[i]);
2673     }
2674     if (armCmseImpLib)
2675       parseArmCMSEImportLib(*armCmseImpLib);
2676   }
2677 
2678   // Now that we have every file, we can decide if we will need a
2679   // dynamic symbol table.
2680   // We need one if we were asked to export dynamic symbols or if we are
2681   // producing a shared library.
2682   // We also need one if any shared libraries are used and for pie executables
2683   // (probably because the dynamic linker needs it).
2684   config->hasDynSymTab =
2685       !ctx.sharedFiles.empty() || config->isPic || config->exportDynamic;
2686 
2687   // Some symbols (such as __ehdr_start) are defined lazily only when there
2688   // are undefined symbols for them, so we add these to trigger that logic.
2689   for (StringRef name : script->referencedSymbols) {
2690     Symbol *sym = addUnusedUndefined(name);
2691     sym->isUsedInRegularObj = true;
2692     sym->referenced = true;
2693   }
2694 
2695   // Prevent LTO from removing any definition referenced by -u.
2696   for (StringRef name : config->undefined)
2697     if (Defined *sym = dyn_cast_or_null<Defined>(symtab.find(name)))
2698       sym->isUsedInRegularObj = true;
2699 
2700   // If an entry symbol is in a static archive, pull out that file now.
2701   if (Symbol *sym = symtab.find(config->entry))
2702     handleUndefined(sym, "--entry");
2703 
2704   // Handle the `--undefined-glob <pattern>` options.
2705   for (StringRef pat : args::getStrings(args, OPT_undefined_glob))
2706     handleUndefinedGlob(pat);
2707 
2708   // Mark -init and -fini symbols so that the LTO doesn't eliminate them.
2709   if (Symbol *sym = dyn_cast_or_null<Defined>(symtab.find(config->init)))
2710     sym->isUsedInRegularObj = true;
2711   if (Symbol *sym = dyn_cast_or_null<Defined>(symtab.find(config->fini)))
2712     sym->isUsedInRegularObj = true;
2713 
2714   // If any of our inputs are bitcode files, the LTO code generator may create
2715   // references to certain library functions that might not be explicit in the
2716   // bitcode file's symbol table. If any of those library functions are defined
2717   // in a bitcode file in an archive member, we need to arrange to use LTO to
2718   // compile those archive members by adding them to the link beforehand.
2719   //
2720   // However, adding all libcall symbols to the link can have undesired
2721   // consequences. For example, the libgcc implementation of
2722   // __sync_val_compare_and_swap_8 on 32-bit ARM pulls in an .init_array entry
2723   // that aborts the program if the Linux kernel does not support 64-bit
2724   // atomics, which would prevent the program from running even if it does not
2725   // use 64-bit atomics.
2726   //
2727   // Therefore, we only add libcall symbols to the link before LTO if we have
2728   // to, i.e. if the symbol's definition is in bitcode. Any other required
2729   // libcall symbols will be added to the link after LTO when we add the LTO
2730   // object file to the link.
2731   if (!ctx.bitcodeFiles.empty())
2732     for (auto *s : lto::LTO::getRuntimeLibcallSymbols())
2733       handleLibcall(s);
2734 
2735   // Archive members defining __wrap symbols may be extracted.
2736   std::vector<WrappedSymbol> wrapped = addWrappedSymbols(args);
2737 
2738   // No more lazy bitcode can be extracted at this point. Do post parse work
2739   // like checking duplicate symbols.
2740   parallelForEach(ctx.objectFiles, [](ELFFileBase *file) {
2741     initSectionsAndLocalSyms(file, /*ignoreComdats=*/false);
2742   });
2743   parallelForEach(ctx.objectFiles, postParseObjectFile);
2744   parallelForEach(ctx.bitcodeFiles,
2745                   [](BitcodeFile *file) { file->postParse(); });
2746   for (auto &it : ctx.nonPrevailingSyms) {
2747     Symbol &sym = *it.first;
2748     Undefined(sym.file, sym.getName(), sym.binding, sym.stOther, sym.type,
2749               it.second)
2750         .overwrite(sym);
2751     cast<Undefined>(sym).nonPrevailing = true;
2752   }
2753   ctx.nonPrevailingSyms.clear();
2754   for (const DuplicateSymbol &d : ctx.duplicates)
2755     reportDuplicate(*d.sym, d.file, d.section, d.value);
2756   ctx.duplicates.clear();
2757 
2758   // Return if there were name resolution errors.
2759   if (errorCount())
2760     return;
2761 
2762   // We want to declare linker script's symbols early,
2763   // so that we can version them.
2764   // They also might be exported if referenced by DSOs.
2765   script->declareSymbols();
2766 
2767   // Handle --exclude-libs. This is before scanVersionScript() due to a
2768   // workaround for Android ndk: for a defined versioned symbol in an archive
2769   // without a version node in the version script, Android does not expect a
2770   // 'has undefined version' error in -shared --exclude-libs=ALL mode (PR36295).
2771   // GNU ld errors in this case.
2772   if (args.hasArg(OPT_exclude_libs))
2773     excludeLibs(args);
2774 
2775   // Create elfHeader early. We need a dummy section in
2776   // addReservedSymbols to mark the created symbols as not absolute.
2777   Out::elfHeader = make<OutputSection>("", 0, SHF_ALLOC);
2778 
2779   // We need to create some reserved symbols such as _end. Create them.
2780   if (!config->relocatable)
2781     addReservedSymbols();
2782 
2783   // Apply version scripts.
2784   //
2785   // For a relocatable output, version scripts don't make sense, and
2786   // parsing a symbol version string (e.g. dropping "@ver1" from a symbol
2787   // name "foo@ver1") rather do harm, so we don't call this if -r is given.
2788   if (!config->relocatable) {
2789     llvm::TimeTraceScope timeScope("Process symbol versions");
2790     symtab.scanVersionScript();
2791   }
2792 
2793   // Skip the normal linked output if some LTO options are specified.
2794   //
2795   // For --thinlto-index-only, index file creation is performed in
2796   // compileBitcodeFiles, so we are done afterwards. --plugin-opt=emit-llvm and
2797   // --plugin-opt=emit-asm create output files in bitcode or assembly code,
2798   // respectively. When only certain thinLTO modules are specified for
2799   // compilation, the intermediate object file are the expected output.
2800   const bool skipLinkedOutput = config->thinLTOIndexOnly || config->emitLLVM ||
2801                                 config->ltoEmitAsm ||
2802                                 !config->thinLTOModulesToCompile.empty();
2803 
2804   // Do link-time optimization if given files are LLVM bitcode files.
2805   // This compiles bitcode files into real object files.
2806   //
2807   // With this the symbol table should be complete. After this, no new names
2808   // except a few linker-synthesized ones will be added to the symbol table.
2809   const size_t numObjsBeforeLTO = ctx.objectFiles.size();
2810   invokeELFT(compileBitcodeFiles, skipLinkedOutput);
2811 
2812   // Symbol resolution finished. Report backward reference problems,
2813   // --print-archive-stats=, and --why-extract=.
2814   reportBackrefs();
2815   writeArchiveStats();
2816   writeWhyExtract();
2817   if (errorCount())
2818     return;
2819 
2820   // Bail out if normal linked output is skipped due to LTO.
2821   if (skipLinkedOutput)
2822     return;
2823 
2824   // compileBitcodeFiles may have produced lto.tmp object files. After this, no
2825   // more file will be added.
2826   auto newObjectFiles = ArrayRef(ctx.objectFiles).slice(numObjsBeforeLTO);
2827   parallelForEach(newObjectFiles, [](ELFFileBase *file) {
2828     initSectionsAndLocalSyms(file, /*ignoreComdats=*/true);
2829   });
2830   parallelForEach(newObjectFiles, postParseObjectFile);
2831   for (const DuplicateSymbol &d : ctx.duplicates)
2832     reportDuplicate(*d.sym, d.file, d.section, d.value);
2833 
2834   // Handle --exclude-libs again because lto.tmp may reference additional
2835   // libcalls symbols defined in an excluded archive. This may override
2836   // versionId set by scanVersionScript().
2837   if (args.hasArg(OPT_exclude_libs))
2838     excludeLibs(args);
2839 
2840   // Record [__acle_se_<sym>, <sym>] pairs for later processing.
2841   processArmCmseSymbols();
2842 
2843   // Apply symbol renames for --wrap and combine foo@v1 and foo@@v1.
2844   redirectSymbols(wrapped);
2845 
2846   // Replace common symbols with regular symbols.
2847   replaceCommonSymbols();
2848 
2849   {
2850     llvm::TimeTraceScope timeScope("Aggregate sections");
2851     // Now that we have a complete list of input files.
2852     // Beyond this point, no new files are added.
2853     // Aggregate all input sections into one place.
2854     for (InputFile *f : ctx.objectFiles) {
2855       for (InputSectionBase *s : f->getSections()) {
2856         if (!s || s == &InputSection::discarded)
2857           continue;
2858         if (LLVM_UNLIKELY(isa<EhInputSection>(s)))
2859           ctx.ehInputSections.push_back(cast<EhInputSection>(s));
2860         else
2861           ctx.inputSections.push_back(s);
2862       }
2863     }
2864     for (BinaryFile *f : ctx.binaryFiles)
2865       for (InputSectionBase *s : f->getSections())
2866         ctx.inputSections.push_back(cast<InputSection>(s));
2867   }
2868 
2869   {
2870     llvm::TimeTraceScope timeScope("Strip sections");
2871     if (ctx.hasSympart.load(std::memory_order_relaxed)) {
2872       llvm::erase_if(ctx.inputSections, [](InputSectionBase *s) {
2873         if (s->type != SHT_LLVM_SYMPART)
2874           return false;
2875         invokeELFT(readSymbolPartitionSection, s);
2876         return true;
2877       });
2878     }
2879     // We do not want to emit debug sections if --strip-all
2880     // or --strip-debug are given.
2881     if (config->strip != StripPolicy::None) {
2882       llvm::erase_if(ctx.inputSections, [](InputSectionBase *s) {
2883         if (isDebugSection(*s))
2884           return true;
2885         if (auto *isec = dyn_cast<InputSection>(s))
2886           if (InputSectionBase *rel = isec->getRelocatedSection())
2887             if (isDebugSection(*rel))
2888               return true;
2889 
2890         return false;
2891       });
2892     }
2893   }
2894 
2895   // Since we now have a complete set of input files, we can create
2896   // a .d file to record build dependencies.
2897   if (!config->dependencyFile.empty())
2898     writeDependencyFile();
2899 
2900   // Now that the number of partitions is fixed, save a pointer to the main
2901   // partition.
2902   mainPart = &partitions[0];
2903 
2904   // Read .note.gnu.property sections from input object files which
2905   // contain a hint to tweak linker's and loader's behaviors.
2906   config->andFeatures = getAndFeatures();
2907 
2908   // The Target instance handles target-specific stuff, such as applying
2909   // relocations or writing a PLT section. It also contains target-dependent
2910   // values such as a default image base address.
2911   target = getTarget();
2912 
2913   config->eflags = target->calcEFlags();
2914   // maxPageSize (sometimes called abi page size) is the maximum page size that
2915   // the output can be run on. For example if the OS can use 4k or 64k page
2916   // sizes then maxPageSize must be 64k for the output to be useable on both.
2917   // All important alignment decisions must use this value.
2918   config->maxPageSize = getMaxPageSize(args);
2919   // commonPageSize is the most common page size that the output will be run on.
2920   // For example if an OS can use 4k or 64k page sizes and 4k is more common
2921   // than 64k then commonPageSize is set to 4k. commonPageSize can be used for
2922   // optimizations such as DATA_SEGMENT_ALIGN in linker scripts. LLD's use of it
2923   // is limited to writing trap instructions on the last executable segment.
2924   config->commonPageSize = getCommonPageSize(args);
2925 
2926   config->imageBase = getImageBase(args);
2927 
2928   // This adds a .comment section containing a version string.
2929   if (!config->relocatable)
2930     ctx.inputSections.push_back(createCommentSection());
2931 
2932   // Split SHF_MERGE and .eh_frame sections into pieces in preparation for garbage collection.
2933   invokeELFT(splitSections,);
2934 
2935   // Garbage collection and removal of shared symbols from unused shared objects.
2936   invokeELFT(markLive,);
2937   demoteSharedAndLazySymbols();
2938 
2939   // Make copies of any input sections that need to be copied into each
2940   // partition.
2941   copySectionsIntoPartitions();
2942 
2943   // Create synthesized sections such as .got and .plt. This is called before
2944   // processSectionCommands() so that they can be placed by SECTIONS commands.
2945   invokeELFT(createSyntheticSections,);
2946 
2947   // Some input sections that are used for exception handling need to be moved
2948   // into synthetic sections. Do that now so that they aren't assigned to
2949   // output sections in the usual way.
2950   if (!config->relocatable)
2951     combineEhSections();
2952 
2953   // Merge .riscv.attributes sections.
2954   if (config->emachine == EM_RISCV)
2955     mergeRISCVAttributesSections();
2956 
2957   {
2958     llvm::TimeTraceScope timeScope("Assign sections");
2959 
2960     // Create output sections described by SECTIONS commands.
2961     script->processSectionCommands();
2962 
2963     // Linker scripts control how input sections are assigned to output
2964     // sections. Input sections that were not handled by scripts are called
2965     // "orphans", and they are assigned to output sections by the default rule.
2966     // Process that.
2967     script->addOrphanSections();
2968   }
2969 
2970   {
2971     llvm::TimeTraceScope timeScope("Merge/finalize input sections");
2972 
2973     // Migrate InputSectionDescription::sectionBases to sections. This includes
2974     // merging MergeInputSections into a single MergeSyntheticSection. From this
2975     // point onwards InputSectionDescription::sections should be used instead of
2976     // sectionBases.
2977     for (SectionCommand *cmd : script->sectionCommands)
2978       if (auto *osd = dyn_cast<OutputDesc>(cmd))
2979         osd->osec.finalizeInputSections();
2980   }
2981 
2982   // Two input sections with different output sections should not be folded.
2983   // ICF runs after processSectionCommands() so that we know the output sections.
2984   if (config->icf != ICFLevel::None) {
2985     invokeELFT(findKeepUniqueSections, args);
2986     invokeELFT(doIcf,);
2987   }
2988 
2989   // Read the callgraph now that we know what was gced or icfed
2990   if (config->callGraphProfileSort) {
2991     if (auto *arg = args.getLastArg(OPT_call_graph_ordering_file))
2992       if (std::optional<MemoryBufferRef> buffer = readFile(arg->getValue()))
2993         readCallGraph(*buffer);
2994     invokeELFT(readCallGraphsFromObjectFiles,);
2995   }
2996 
2997   // Write the result to the file.
2998   invokeELFT(writeResult,);
2999 }
3000