1 //===- LinkerScript.cpp ---------------------------------------------------===// 2 // 3 // The LLVM Linker 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains the parser/evaluator of the linker script. 11 // It parses a linker script and write the result to Config or ScriptConfig 12 // objects. 13 // 14 // If SECTIONS command is used, a ScriptConfig contains an AST 15 // of the command which will later be consumed by createSections() and 16 // assignAddresses(). 17 // 18 //===----------------------------------------------------------------------===// 19 20 #include "LinkerScript.h" 21 #include "Config.h" 22 #include "Driver.h" 23 #include "InputSection.h" 24 #include "OutputSections.h" 25 #include "ScriptParser.h" 26 #include "Strings.h" 27 #include "Symbols.h" 28 #include "SymbolTable.h" 29 #include "Target.h" 30 #include "Writer.h" 31 #include "llvm/ADT/StringSwitch.h" 32 #include "llvm/Support/ELF.h" 33 #include "llvm/Support/FileSystem.h" 34 #include "llvm/Support/MemoryBuffer.h" 35 #include "llvm/Support/Path.h" 36 #include "llvm/Support/StringSaver.h" 37 38 using namespace llvm; 39 using namespace llvm::ELF; 40 using namespace llvm::object; 41 using namespace lld; 42 using namespace lld::elf; 43 44 ScriptConfiguration *elf::ScriptConfig; 45 46 template <class ELFT> 47 static void addRegular(SymbolAssignment *Cmd) { 48 Symbol *Sym = Symtab<ELFT>::X->addRegular(Cmd->Name, STB_GLOBAL, STV_DEFAULT); 49 Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; 50 Cmd->Sym = Sym->body(); 51 } 52 53 template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) { 54 Symbol *Sym = Symtab<ELFT>::X->addSynthetic(Cmd->Name, nullptr, 0); 55 Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; 56 Cmd->Sym = Sym->body(); 57 } 58 59 // If a symbol was in PROVIDE(), we need to define it only when 60 // it is an undefined symbol. 61 template <class ELFT> static bool shouldDefine(SymbolAssignment *Cmd) { 62 if (Cmd->Name == ".") 63 return false; 64 if (!Cmd->Provide) 65 return true; 66 SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name); 67 return B && B->isUndefined(); 68 } 69 70 bool SymbolAssignment::classof(const BaseCommand *C) { 71 return C->Kind == AssignmentKind; 72 } 73 74 bool OutputSectionCommand::classof(const BaseCommand *C) { 75 return C->Kind == OutputSectionKind; 76 } 77 78 bool InputSectionDescription::classof(const BaseCommand *C) { 79 return C->Kind == InputSectionKind; 80 } 81 82 bool AssertCommand::classof(const BaseCommand *C) { 83 return C->Kind == AssertKind; 84 } 85 86 template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S) { 87 return !S || !S->Live; 88 } 89 90 template <class ELFT> LinkerScript<ELFT>::LinkerScript() {} 91 template <class ELFT> LinkerScript<ELFT>::~LinkerScript() {} 92 93 template <class ELFT> 94 bool LinkerScript<ELFT>::shouldKeep(InputSectionBase<ELFT> *S) { 95 for (StringRef Pat : Opt.KeptSections) 96 if (globMatch(Pat, S->getSectionName())) 97 return true; 98 return false; 99 } 100 101 static bool match(ArrayRef<StringRef> Patterns, StringRef S) { 102 for (StringRef Pat : Patterns) 103 if (globMatch(Pat, S)) 104 return true; 105 return false; 106 } 107 108 static bool fileMatches(const InputSectionDescription *Desc, 109 StringRef Filename) { 110 if (!globMatch(Desc->FilePattern, Filename)) 111 return false; 112 return Desc->ExcludedFiles.empty() || !match(Desc->ExcludedFiles, Filename); 113 } 114 115 // Returns input sections filtered by given glob patterns. 116 template <class ELFT> 117 std::vector<InputSectionBase<ELFT> *> 118 LinkerScript<ELFT>::getInputSections(const InputSectionDescription *I) { 119 ArrayRef<StringRef> Patterns = I->SectionPatterns; 120 std::vector<InputSectionBase<ELFT> *> Ret; 121 for (const std::unique_ptr<ObjectFile<ELFT>> &F : 122 Symtab<ELFT>::X->getObjectFiles()) { 123 if (fileMatches(I, sys::path::filename(F->getName()))) 124 for (InputSectionBase<ELFT> *S : F->getSections()) 125 if (!isDiscarded(S) && !S->OutSec && 126 match(Patterns, S->getSectionName())) 127 Ret.push_back(S); 128 } 129 130 if (llvm::find(Patterns, "COMMON") != Patterns.end()) 131 Ret.push_back(CommonInputSection<ELFT>::X); 132 133 return Ret; 134 } 135 136 // You can define new symbols using linker scripts. For example, 137 // ".text { abc.o(.text); foo = .; def.o(.text); }" defines symbol 138 // foo just after abc.o's text section contents. This class is to 139 // handle such symbol definitions. 140 // 141 // In order to handle scripts like the above one, we want to 142 // keep symbol definitions in output sections. Because output sections 143 // can contain only input sections, we wrap symbol definitions 144 // with dummy input sections. This class serves that purpose. 145 template <class ELFT> 146 class elf::LayoutInputSection : public InputSectionBase<ELFT> { 147 public: 148 explicit LayoutInputSection(SymbolAssignment *Cmd); 149 static bool classof(const InputSectionBase<ELFT> *S); 150 SymbolAssignment *Cmd; 151 152 private: 153 typename ELFT::Shdr Hdr; 154 }; 155 156 template <class ELFT> 157 static InputSectionBase<ELFT> * 158 getNonLayoutSection(std::vector<InputSectionBase<ELFT> *> &Vec) { 159 for (InputSectionBase<ELFT> *S : Vec) 160 if (!isa<LayoutInputSection<ELFT>>(S)) 161 return S; 162 return nullptr; 163 } 164 165 template <class T> static T *zero(T *Val) { 166 memset(Val, 0, sizeof(*Val)); 167 return Val; 168 } 169 170 template <class ELFT> 171 LayoutInputSection<ELFT>::LayoutInputSection(SymbolAssignment *Cmd) 172 : InputSectionBase<ELFT>(nullptr, zero(&Hdr), 173 InputSectionBase<ELFT>::Layout), 174 Cmd(Cmd) { 175 this->Live = true; 176 Hdr.sh_type = SHT_NOBITS; 177 } 178 179 template <class ELFT> 180 bool LayoutInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) { 181 return S->SectionKind == InputSectionBase<ELFT>::Layout; 182 } 183 184 template <class ELFT> 185 static bool compareName(InputSectionBase<ELFT> *A, InputSectionBase<ELFT> *B) { 186 return A->getSectionName() < B->getSectionName(); 187 } 188 189 template <class ELFT> 190 static bool compareAlignment(InputSectionBase<ELFT> *A, 191 InputSectionBase<ELFT> *B) { 192 // ">" is not a mistake. Larger alignments are placed before smaller 193 // alignments in order to reduce the amount of padding necessary. 194 // This is compatible with GNU. 195 return A->Alignment > B->Alignment; 196 } 197 198 template <class ELFT> 199 static std::function<bool(InputSectionBase<ELFT> *, InputSectionBase<ELFT> *)> 200 getComparator(SortKind K) { 201 if (K == SortByName) 202 return compareName<ELFT>; 203 return compareAlignment<ELFT>; 204 } 205 206 template <class ELFT> 207 void LinkerScript<ELFT>::discard(OutputSectionCommand &Cmd) { 208 for (const std::unique_ptr<BaseCommand> &Base : Cmd.Commands) { 209 if (auto *Cmd = dyn_cast<InputSectionDescription>(Base.get())) { 210 for (InputSectionBase<ELFT> *S : getInputSections(Cmd)) { 211 S->Live = false; 212 reportDiscarded(S); 213 } 214 } 215 } 216 } 217 218 static bool checkConstraint(uint64_t Flags, ConstraintKind Kind) { 219 bool RO = (Kind == ConstraintKind::ReadOnly); 220 bool RW = (Kind == ConstraintKind::ReadWrite); 221 bool Writable = Flags & SHF_WRITE; 222 return !((RO && Writable) || (RW && !Writable)); 223 } 224 225 template <class ELFT> 226 static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections, 227 ConstraintKind Kind) { 228 if (Kind == ConstraintKind::NoConstraint) 229 return true; 230 return llvm::all_of(Sections, [=](InputSectionBase<ELFT> *Sec) { 231 return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind); 232 }); 233 } 234 235 template <class ELFT> 236 std::vector<InputSectionBase<ELFT> *> 237 LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) { 238 std::vector<InputSectionBase<ELFT> *> Ret; 239 240 for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) { 241 if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) { 242 if (shouldDefine<ELFT>(OutCmd)) 243 addSynthetic<ELFT>(OutCmd); 244 Ret.push_back(new (LAlloc.Allocate()) LayoutInputSection<ELFT>(OutCmd)); 245 continue; 246 } 247 248 auto *Cmd = cast<InputSectionDescription>(Base.get()); 249 std::vector<InputSectionBase<ELFT> *> V = getInputSections(Cmd); 250 if (!matchConstraints<ELFT>(V, OutCmd.Constraint)) 251 continue; 252 if (Cmd->SortInner) 253 std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortInner)); 254 if (Cmd->SortOuter) 255 std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortOuter)); 256 Ret.insert(Ret.end(), V.begin(), V.end()); 257 } 258 return Ret; 259 } 260 261 template <class ELFT> 262 void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) { 263 for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) { 264 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) { 265 if (shouldDefine<ELFT>(Cmd)) 266 addRegular<ELFT>(Cmd); 267 continue; 268 } 269 270 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) { 271 if (Cmd->Name == "/DISCARD/") { 272 discard(*Cmd); 273 continue; 274 } 275 276 std::vector<InputSectionBase<ELFT> *> V = createInputSectionList(*Cmd); 277 InputSectionBase<ELFT> *Head = getNonLayoutSection<ELFT>(V); 278 if (!Head) 279 continue; 280 281 OutputSectionBase<ELFT> *OutSec; 282 bool IsNew; 283 std::tie(OutSec, IsNew) = Factory.create(Head, Cmd->Name); 284 if (IsNew) 285 OutputSections->push_back(OutSec); 286 for (InputSectionBase<ELFT> *Sec : V) 287 OutSec->addSection(Sec); 288 } 289 } 290 291 // Add orphan sections. 292 for (const std::unique_ptr<ObjectFile<ELFT>> &F : 293 Symtab<ELFT>::X->getObjectFiles()) { 294 for (InputSectionBase<ELFT> *S : F->getSections()) { 295 if (isDiscarded(S) || S->OutSec) 296 continue; 297 OutputSectionBase<ELFT> *OutSec; 298 bool IsNew; 299 std::tie(OutSec, IsNew) = Factory.create(S, getOutputSectionName(S)); 300 if (IsNew) 301 OutputSections->push_back(OutSec); 302 OutSec->addSection(S); 303 } 304 } 305 } 306 307 template <class ELFT> void assignOffsets(OutputSectionBase<ELFT> *Sec) { 308 auto *OutSec = dyn_cast<OutputSection<ELFT>>(Sec); 309 if (!OutSec) { 310 Sec->assignOffsets(); 311 return; 312 } 313 314 typedef typename ELFT::uint uintX_t; 315 uintX_t Off = 0; 316 317 for (InputSection<ELFT> *I : OutSec->Sections) { 318 if (auto *L = dyn_cast<LayoutInputSection<ELFT>>(I)) { 319 uintX_t Value = L->Cmd->Expression(Sec->getVA() + Off) - Sec->getVA(); 320 if (L->Cmd->Name == ".") { 321 Off = Value; 322 } else if (auto *Sym = 323 cast_or_null<DefinedSynthetic<ELFT>>(L->Cmd->Sym)) { 324 // shouldDefine could have returned false, so we need to check Sym, 325 // for non-null value. 326 Sym->Section = OutSec; 327 Sym->Value = Value; 328 } 329 } else { 330 Off = alignTo(Off, I->Alignment); 331 I->OutSecOff = Off; 332 Off += I->getSize(); 333 } 334 // Update section size inside for-loop, so that SIZEOF 335 // works correctly in the case below: 336 // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) } 337 Sec->setSize(Off); 338 } 339 } 340 341 template <class ELFT> 342 static OutputSectionBase<ELFT> * 343 findSection(OutputSectionCommand &Cmd, 344 ArrayRef<OutputSectionBase<ELFT> *> Sections) { 345 for (OutputSectionBase<ELFT> *Sec : Sections) { 346 if (Sec->getName() != Cmd.Name) 347 continue; 348 if (checkConstraint(Sec->getFlags(), Cmd.Constraint)) 349 return Sec; 350 } 351 return nullptr; 352 } 353 354 template <class ELFT> void LinkerScript<ELFT>::assignAddresses() { 355 // Orphan sections are sections present in the input files which 356 // are not explicitly placed into the output file by the linker script. 357 // We place orphan sections at end of file. 358 // Other linkers places them using some heuristics as described in 359 // https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections. 360 for (OutputSectionBase<ELFT> *Sec : *OutputSections) { 361 StringRef Name = Sec->getName(); 362 if (getSectionIndex(Name) == INT_MAX) 363 Opt.Commands.push_back(llvm::make_unique<OutputSectionCommand>(Name)); 364 } 365 366 // Assign addresses as instructed by linker script SECTIONS sub-commands. 367 Dot = getHeaderSize(); 368 uintX_t MinVA = std::numeric_limits<uintX_t>::max(); 369 uintX_t ThreadBssOffset = 0; 370 371 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 372 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) { 373 if (Cmd->Name == ".") { 374 Dot = Cmd->Expression(Dot); 375 } else if (Cmd->Sym) { 376 cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(Dot); 377 } 378 continue; 379 } 380 381 if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) { 382 Cmd->Expression(Dot); 383 continue; 384 } 385 386 auto *Cmd = cast<OutputSectionCommand>(Base.get()); 387 OutputSectionBase<ELFT> *Sec = findSection<ELFT>(*Cmd, *OutputSections); 388 if (!Sec) 389 continue; 390 391 if (Cmd->AddrExpr) 392 Dot = Cmd->AddrExpr(Dot); 393 394 if (Cmd->AlignExpr) 395 Sec->updateAlignment(Cmd->AlignExpr(Dot)); 396 397 if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { 398 uintX_t TVA = Dot + ThreadBssOffset; 399 TVA = alignTo(TVA, Sec->getAlignment()); 400 Sec->setVA(TVA); 401 assignOffsets(Sec); 402 ThreadBssOffset = TVA - Dot + Sec->getSize(); 403 continue; 404 } 405 406 if (!(Sec->getFlags() & SHF_ALLOC)) { 407 Sec->assignOffsets(); 408 continue; 409 } 410 411 Dot = alignTo(Dot, Sec->getAlignment()); 412 Sec->setVA(Dot); 413 assignOffsets(Sec); 414 MinVA = std::min(MinVA, Dot); 415 Dot += Sec->getSize(); 416 } 417 418 // ELF and Program headers need to be right before the first section in 419 // memory. Set their addresses accordingly. 420 MinVA = alignDown(MinVA - Out<ELFT>::ElfHeader->getSize() - 421 Out<ELFT>::ProgramHeaders->getSize(), 422 Target->PageSize); 423 Out<ELFT>::ElfHeader->setVA(MinVA); 424 Out<ELFT>::ProgramHeaders->setVA(Out<ELFT>::ElfHeader->getSize() + MinVA); 425 } 426 427 template <class ELFT> 428 std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() { 429 ArrayRef<OutputSectionBase<ELFT> *> Sections = *OutputSections; 430 std::vector<PhdrEntry<ELFT>> Ret; 431 432 for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) { 433 Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags); 434 PhdrEntry<ELFT> &Phdr = Ret.back(); 435 436 if (Cmd.HasFilehdr) 437 Phdr.add(Out<ELFT>::ElfHeader); 438 if (Cmd.HasPhdrs) 439 Phdr.add(Out<ELFT>::ProgramHeaders); 440 441 switch (Cmd.Type) { 442 case PT_INTERP: 443 if (Out<ELFT>::Interp) 444 Phdr.add(Out<ELFT>::Interp); 445 break; 446 case PT_DYNAMIC: 447 if (Out<ELFT>::DynSymTab) { 448 Phdr.H.p_flags = Out<ELFT>::Dynamic->getPhdrFlags(); 449 Phdr.add(Out<ELFT>::Dynamic); 450 } 451 break; 452 case PT_GNU_EH_FRAME: 453 if (!Out<ELFT>::EhFrame->empty() && Out<ELFT>::EhFrameHdr) { 454 Phdr.H.p_flags = Out<ELFT>::EhFrameHdr->getPhdrFlags(); 455 Phdr.add(Out<ELFT>::EhFrameHdr); 456 } 457 break; 458 } 459 } 460 461 PhdrEntry<ELFT> *Load = nullptr; 462 uintX_t Flags = PF_R; 463 for (OutputSectionBase<ELFT> *Sec : Sections) { 464 if (!(Sec->getFlags() & SHF_ALLOC)) 465 break; 466 467 std::vector<size_t> PhdrIds = getPhdrIndices(Sec->getName()); 468 if (!PhdrIds.empty()) { 469 // Assign headers specified by linker script 470 for (size_t Id : PhdrIds) { 471 Ret[Id].add(Sec); 472 if (Opt.PhdrsCommands[Id].Flags == UINT_MAX) 473 Ret[Id].H.p_flags |= Sec->getPhdrFlags(); 474 } 475 } else { 476 // If we have no load segment or flags've changed then we want new load 477 // segment. 478 uintX_t NewFlags = Sec->getPhdrFlags(); 479 if (Load == nullptr || Flags != NewFlags) { 480 Load = &*Ret.emplace(Ret.end(), PT_LOAD, NewFlags); 481 Flags = NewFlags; 482 } 483 Load->add(Sec); 484 } 485 } 486 return Ret; 487 } 488 489 template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() { 490 // Ignore .interp section in case we have PHDRS specification 491 // and PT_INTERP isn't listed. 492 return !Opt.PhdrsCommands.empty() && 493 llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) { 494 return Cmd.Type == PT_INTERP; 495 }) == Opt.PhdrsCommands.end(); 496 } 497 498 template <class ELFT> 499 ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) { 500 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 501 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 502 if (Cmd->Name == Name) 503 return Cmd->Filler; 504 return {}; 505 } 506 507 template <class ELFT> Expr LinkerScript<ELFT>::getLma(StringRef Name) { 508 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 509 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 510 if (Cmd->LmaExpr && Cmd->Name == Name) 511 return Cmd->LmaExpr; 512 return {}; 513 } 514 515 // Returns the index of the given section name in linker script 516 // SECTIONS commands. Sections are laid out as the same order as they 517 // were in the script. If a given name did not appear in the script, 518 // it returns INT_MAX, so that it will be laid out at end of file. 519 template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) { 520 int I = 0; 521 for (std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 522 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 523 if (Cmd->Name == Name) 524 return I; 525 ++I; 526 } 527 return INT_MAX; 528 } 529 530 // A compartor to sort output sections. Returns -1 or 1 if 531 // A or B are mentioned in linker script. Otherwise, returns 0. 532 template <class ELFT> 533 int LinkerScript<ELFT>::compareSections(StringRef A, StringRef B) { 534 int I = getSectionIndex(A); 535 int J = getSectionIndex(B); 536 if (I == INT_MAX && J == INT_MAX) 537 return 0; 538 return I < J ? -1 : 1; 539 } 540 541 template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() { 542 return !Opt.PhdrsCommands.empty(); 543 } 544 545 template <class ELFT> 546 typename ELFT::uint LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) { 547 for (OutputSectionBase<ELFT> *Sec : *OutputSections) 548 if (Sec->getName() == Name) 549 return Sec->getSize(); 550 error("undefined section " + Name); 551 return 0; 552 } 553 554 template <class ELFT> 555 typename ELFT::uint LinkerScript<ELFT>::getHeaderSize() { 556 return Out<ELFT>::ElfHeader->getSize() + Out<ELFT>::ProgramHeaders->getSize(); 557 } 558 559 // Returns indices of ELF headers containing specific section, identified 560 // by Name. Each index is a zero based number of ELF header listed within 561 // PHDRS {} script block. 562 template <class ELFT> 563 std::vector<size_t> LinkerScript<ELFT>::getPhdrIndices(StringRef SectionName) { 564 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 565 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 566 if (!Cmd || Cmd->Name != SectionName) 567 continue; 568 569 std::vector<size_t> Ret; 570 for (StringRef PhdrName : Cmd->Phdrs) 571 Ret.push_back(getPhdrIndex(PhdrName)); 572 return Ret; 573 } 574 return {}; 575 } 576 577 template <class ELFT> 578 size_t LinkerScript<ELFT>::getPhdrIndex(StringRef PhdrName) { 579 size_t I = 0; 580 for (PhdrsCommand &Cmd : Opt.PhdrsCommands) { 581 if (Cmd.Name == PhdrName) 582 return I; 583 ++I; 584 } 585 error("section header '" + PhdrName + "' is not listed in PHDRS"); 586 return 0; 587 } 588 589 class elf::ScriptParser : public ScriptParserBase { 590 typedef void (ScriptParser::*Handler)(); 591 592 public: 593 ScriptParser(StringRef S, bool B) : ScriptParserBase(S), IsUnderSysroot(B) {} 594 595 void run(); 596 597 private: 598 void addFile(StringRef Path); 599 600 void readAsNeeded(); 601 void readEntry(); 602 void readExtern(); 603 void readGroup(); 604 void readInclude(); 605 void readNothing() {} 606 void readOutput(); 607 void readOutputArch(); 608 void readOutputFormat(); 609 void readPhdrs(); 610 void readSearchDir(); 611 void readSections(); 612 613 SymbolAssignment *readAssignment(StringRef Name); 614 OutputSectionCommand *readOutputSectionDescription(StringRef OutSec); 615 std::vector<uint8_t> readOutputSectionFiller(); 616 std::vector<StringRef> readOutputSectionPhdrs(); 617 InputSectionDescription *readInputSectionDescription(); 618 std::vector<StringRef> readInputFilePatterns(); 619 InputSectionDescription *readInputSectionRules(); 620 unsigned readPhdrType(); 621 SortKind readSortKind(); 622 SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); 623 SymbolAssignment *readProvideOrAssignment(StringRef Tok); 624 void readSort(); 625 Expr readAssert(); 626 627 Expr readExpr(); 628 Expr readExpr1(Expr Lhs, int MinPrec); 629 Expr readPrimary(); 630 Expr readTernary(Expr Cond); 631 Expr readParenExpr(); 632 633 const static StringMap<Handler> Cmd; 634 ScriptConfiguration &Opt = *ScriptConfig; 635 StringSaver Saver = {ScriptConfig->Alloc}; 636 bool IsUnderSysroot; 637 }; 638 639 const StringMap<elf::ScriptParser::Handler> elf::ScriptParser::Cmd = { 640 {"ENTRY", &ScriptParser::readEntry}, 641 {"EXTERN", &ScriptParser::readExtern}, 642 {"GROUP", &ScriptParser::readGroup}, 643 {"INCLUDE", &ScriptParser::readInclude}, 644 {"INPUT", &ScriptParser::readGroup}, 645 {"OUTPUT", &ScriptParser::readOutput}, 646 {"OUTPUT_ARCH", &ScriptParser::readOutputArch}, 647 {"OUTPUT_FORMAT", &ScriptParser::readOutputFormat}, 648 {"PHDRS", &ScriptParser::readPhdrs}, 649 {"SEARCH_DIR", &ScriptParser::readSearchDir}, 650 {"SECTIONS", &ScriptParser::readSections}, 651 {";", &ScriptParser::readNothing}}; 652 653 void ScriptParser::run() { 654 while (!atEOF()) { 655 StringRef Tok = next(); 656 if (Handler Fn = Cmd.lookup(Tok)) 657 (this->*Fn)(); 658 else 659 setError("unknown directive: " + Tok); 660 } 661 } 662 663 void ScriptParser::addFile(StringRef S) { 664 if (IsUnderSysroot && S.startswith("/")) { 665 SmallString<128> Path; 666 (Config->Sysroot + S).toStringRef(Path); 667 if (sys::fs::exists(Path)) { 668 Driver->addFile(Saver.save(Path.str())); 669 return; 670 } 671 } 672 673 if (sys::path::is_absolute(S)) { 674 Driver->addFile(S); 675 } else if (S.startswith("=")) { 676 if (Config->Sysroot.empty()) 677 Driver->addFile(S.substr(1)); 678 else 679 Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1))); 680 } else if (S.startswith("-l")) { 681 Driver->addLibrary(S.substr(2)); 682 } else if (sys::fs::exists(S)) { 683 Driver->addFile(S); 684 } else { 685 std::string Path = findFromSearchPaths(S); 686 if (Path.empty()) 687 setError("unable to find " + S); 688 else 689 Driver->addFile(Saver.save(Path)); 690 } 691 } 692 693 void ScriptParser::readAsNeeded() { 694 expect("("); 695 bool Orig = Config->AsNeeded; 696 Config->AsNeeded = true; 697 while (!Error && !skip(")")) 698 addFile(next()); 699 Config->AsNeeded = Orig; 700 } 701 702 void ScriptParser::readEntry() { 703 // -e <symbol> takes predecence over ENTRY(<symbol>). 704 expect("("); 705 StringRef Tok = next(); 706 if (Config->Entry.empty()) 707 Config->Entry = Tok; 708 expect(")"); 709 } 710 711 void ScriptParser::readExtern() { 712 expect("("); 713 while (!Error && !skip(")")) 714 Config->Undefined.push_back(next()); 715 } 716 717 void ScriptParser::readGroup() { 718 expect("("); 719 while (!Error && !skip(")")) { 720 StringRef Tok = next(); 721 if (Tok == "AS_NEEDED") 722 readAsNeeded(); 723 else 724 addFile(Tok); 725 } 726 } 727 728 void ScriptParser::readInclude() { 729 StringRef Tok = next(); 730 auto MBOrErr = MemoryBuffer::getFile(Tok); 731 if (!MBOrErr) { 732 setError("cannot open " + Tok); 733 return; 734 } 735 std::unique_ptr<MemoryBuffer> &MB = *MBOrErr; 736 StringRef S = Saver.save(MB->getMemBufferRef().getBuffer()); 737 std::vector<StringRef> V = tokenize(S); 738 Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end()); 739 } 740 741 void ScriptParser::readOutput() { 742 // -o <file> takes predecence over OUTPUT(<file>). 743 expect("("); 744 StringRef Tok = next(); 745 if (Config->OutputFile.empty()) 746 Config->OutputFile = Tok; 747 expect(")"); 748 } 749 750 void ScriptParser::readOutputArch() { 751 // Error checking only for now. 752 expect("("); 753 next(); 754 expect(")"); 755 } 756 757 void ScriptParser::readOutputFormat() { 758 // Error checking only for now. 759 expect("("); 760 next(); 761 StringRef Tok = next(); 762 if (Tok == ")") 763 return; 764 if (Tok != ",") { 765 setError("unexpected token: " + Tok); 766 return; 767 } 768 next(); 769 expect(","); 770 next(); 771 expect(")"); 772 } 773 774 void ScriptParser::readPhdrs() { 775 expect("{"); 776 while (!Error && !skip("}")) { 777 StringRef Tok = next(); 778 Opt.PhdrsCommands.push_back({Tok, PT_NULL, false, false, UINT_MAX}); 779 PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back(); 780 781 PhdrCmd.Type = readPhdrType(); 782 do { 783 Tok = next(); 784 if (Tok == ";") 785 break; 786 if (Tok == "FILEHDR") 787 PhdrCmd.HasFilehdr = true; 788 else if (Tok == "PHDRS") 789 PhdrCmd.HasPhdrs = true; 790 else if (Tok == "FLAGS") { 791 expect("("); 792 // Passing 0 for the value of dot is a bit of a hack. It means that 793 // we accept expressions like ".|1". 794 PhdrCmd.Flags = readExpr()(0); 795 expect(")"); 796 } else 797 setError("unexpected header attribute: " + Tok); 798 } while (!Error); 799 } 800 } 801 802 void ScriptParser::readSearchDir() { 803 expect("("); 804 Config->SearchPaths.push_back(next()); 805 expect(")"); 806 } 807 808 void ScriptParser::readSections() { 809 Opt.HasContents = true; 810 expect("{"); 811 while (!Error && !skip("}")) { 812 StringRef Tok = next(); 813 BaseCommand *Cmd = readProvideOrAssignment(Tok); 814 if (!Cmd) { 815 if (Tok == "ASSERT") 816 Cmd = new AssertCommand(readAssert()); 817 else 818 Cmd = readOutputSectionDescription(Tok); 819 } 820 Opt.Commands.emplace_back(Cmd); 821 } 822 } 823 824 static int precedence(StringRef Op) { 825 return StringSwitch<int>(Op) 826 .Case("*", 4) 827 .Case("/", 4) 828 .Case("+", 3) 829 .Case("-", 3) 830 .Case("<", 2) 831 .Case(">", 2) 832 .Case(">=", 2) 833 .Case("<=", 2) 834 .Case("==", 2) 835 .Case("!=", 2) 836 .Case("&", 1) 837 .Default(-1); 838 } 839 840 std::vector<StringRef> ScriptParser::readInputFilePatterns() { 841 std::vector<StringRef> V; 842 while (!Error && !skip(")")) 843 V.push_back(next()); 844 return V; 845 } 846 847 SortKind ScriptParser::readSortKind() { 848 if (skip("SORT") || skip("SORT_BY_NAME")) 849 return SortByName; 850 if (skip("SORT_BY_ALIGNMENT")) 851 return SortByAlignment; 852 return SortNone; 853 } 854 855 InputSectionDescription *ScriptParser::readInputSectionRules() { 856 auto *Cmd = new InputSectionDescription; 857 Cmd->FilePattern = next(); 858 expect("("); 859 860 // Read EXCLUDE_FILE(). 861 if (skip("EXCLUDE_FILE")) { 862 expect("("); 863 while (!Error && !skip(")")) 864 Cmd->ExcludedFiles.push_back(next()); 865 } 866 867 // Read SORT(). 868 if (SortKind K1 = readSortKind()) { 869 Cmd->SortOuter = K1; 870 expect("("); 871 if (SortKind K2 = readSortKind()) { 872 Cmd->SortInner = K2; 873 expect("("); 874 Cmd->SectionPatterns = readInputFilePatterns(); 875 expect(")"); 876 } else { 877 Cmd->SectionPatterns = readInputFilePatterns(); 878 } 879 expect(")"); 880 return Cmd; 881 } 882 883 Cmd->SectionPatterns = readInputFilePatterns(); 884 return Cmd; 885 } 886 887 InputSectionDescription *ScriptParser::readInputSectionDescription() { 888 // Input section wildcard can be surrounded by KEEP. 889 // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep 890 if (skip("KEEP")) { 891 expect("("); 892 InputSectionDescription *Cmd = readInputSectionRules(); 893 expect(")"); 894 Opt.KeptSections.insert(Opt.KeptSections.end(), 895 Cmd->SectionPatterns.begin(), 896 Cmd->SectionPatterns.end()); 897 return Cmd; 898 } 899 return readInputSectionRules(); 900 } 901 902 void ScriptParser::readSort() { 903 expect("("); 904 expect("CONSTRUCTORS"); 905 expect(")"); 906 } 907 908 Expr ScriptParser::readAssert() { 909 expect("("); 910 Expr E = readExpr(); 911 expect(","); 912 StringRef Msg = next(); 913 expect(")"); 914 return [=](uint64_t Dot) { 915 uint64_t V = E(Dot); 916 if (!V) 917 error(Msg); 918 return V; 919 }; 920 } 921 922 OutputSectionCommand * 923 ScriptParser::readOutputSectionDescription(StringRef OutSec) { 924 OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec); 925 926 // Read an address expression. 927 // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address 928 if (peek() != ":") 929 Cmd->AddrExpr = readExpr(); 930 931 expect(":"); 932 933 if (skip("AT")) 934 Cmd->LmaExpr = readParenExpr(); 935 if (skip("ALIGN")) 936 Cmd->AlignExpr = readParenExpr(); 937 938 // Parse constraints. 939 if (skip("ONLY_IF_RO")) 940 Cmd->Constraint = ConstraintKind::ReadOnly; 941 if (skip("ONLY_IF_RW")) 942 Cmd->Constraint = ConstraintKind::ReadWrite; 943 expect("{"); 944 945 while (!Error && !skip("}")) { 946 if (peek().startswith("*") || peek() == "KEEP") { 947 Cmd->Commands.emplace_back(readInputSectionDescription()); 948 continue; 949 } 950 951 StringRef Tok = next(); 952 if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok)) 953 Cmd->Commands.emplace_back(Assignment); 954 else if (Tok == "SORT") 955 readSort(); 956 else 957 setError("unknown command " + Tok); 958 } 959 Cmd->Phdrs = readOutputSectionPhdrs(); 960 Cmd->Filler = readOutputSectionFiller(); 961 return Cmd; 962 } 963 964 std::vector<uint8_t> ScriptParser::readOutputSectionFiller() { 965 StringRef Tok = peek(); 966 if (!Tok.startswith("=")) 967 return {}; 968 next(); 969 970 // Read a hexstring of arbitrary length. 971 if (Tok.startswith("=0x")) 972 return parseHex(Tok.substr(3)); 973 974 // Read a decimal or octal value as a big-endian 32 bit value. 975 // Why do this? I don't know, but that's what gold does. 976 uint32_t V; 977 if (Tok.substr(1).getAsInteger(0, V)) { 978 setError("invalid filler expression: " + Tok); 979 return {}; 980 } 981 return { uint8_t(V >> 24), uint8_t(V >> 16), uint8_t(V >> 8), uint8_t(V) }; 982 } 983 984 SymbolAssignment *ScriptParser::readProvideHidden(bool Provide, bool Hidden) { 985 expect("("); 986 SymbolAssignment *Cmd = readAssignment(next()); 987 Cmd->Provide = Provide; 988 Cmd->Hidden = Hidden; 989 expect(")"); 990 expect(";"); 991 return Cmd; 992 } 993 994 SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok) { 995 SymbolAssignment *Cmd = nullptr; 996 if (peek() == "=" || peek() == "+=") { 997 Cmd = readAssignment(Tok); 998 expect(";"); 999 } else if (Tok == "PROVIDE") { 1000 Cmd = readProvideHidden(true, false); 1001 } else if (Tok == "HIDDEN") { 1002 Cmd = readProvideHidden(false, true); 1003 } else if (Tok == "PROVIDE_HIDDEN") { 1004 Cmd = readProvideHidden(true, true); 1005 } 1006 return Cmd; 1007 } 1008 1009 static uint64_t getSymbolValue(StringRef S, uint64_t Dot) { 1010 if (S == ".") 1011 return Dot; 1012 1013 switch (Config->EKind) { 1014 case ELF32LEKind: 1015 if (SymbolBody *B = Symtab<ELF32LE>::X->find(S)) 1016 return B->getVA<ELF32LE>(); 1017 break; 1018 case ELF32BEKind: 1019 if (SymbolBody *B = Symtab<ELF32BE>::X->find(S)) 1020 return B->getVA<ELF32BE>(); 1021 break; 1022 case ELF64LEKind: 1023 if (SymbolBody *B = Symtab<ELF64LE>::X->find(S)) 1024 return B->getVA<ELF64LE>(); 1025 break; 1026 case ELF64BEKind: 1027 if (SymbolBody *B = Symtab<ELF64BE>::X->find(S)) 1028 return B->getVA<ELF64BE>(); 1029 break; 1030 default: 1031 llvm_unreachable("unsupported target"); 1032 } 1033 error("symbol not found: " + S); 1034 return 0; 1035 } 1036 1037 static uint64_t getSectionSize(StringRef Name) { 1038 switch (Config->EKind) { 1039 case ELF32LEKind: 1040 return Script<ELF32LE>::X->getOutputSectionSize(Name); 1041 case ELF32BEKind: 1042 return Script<ELF32BE>::X->getOutputSectionSize(Name); 1043 case ELF64LEKind: 1044 return Script<ELF64LE>::X->getOutputSectionSize(Name); 1045 case ELF64BEKind: 1046 return Script<ELF64BE>::X->getOutputSectionSize(Name); 1047 default: 1048 llvm_unreachable("unsupported target"); 1049 } 1050 } 1051 1052 static uint64_t getHeaderSize() { 1053 switch (Config->EKind) { 1054 case ELF32LEKind: 1055 return Script<ELF32LE>::X->getHeaderSize(); 1056 case ELF32BEKind: 1057 return Script<ELF32BE>::X->getHeaderSize(); 1058 case ELF64LEKind: 1059 return Script<ELF64LE>::X->getHeaderSize(); 1060 case ELF64BEKind: 1061 return Script<ELF64BE>::X->getHeaderSize(); 1062 default: 1063 llvm_unreachable("unsupported target"); 1064 } 1065 } 1066 1067 SymbolAssignment *ScriptParser::readAssignment(StringRef Name) { 1068 StringRef Op = next(); 1069 assert(Op == "=" || Op == "+="); 1070 Expr E = readExpr(); 1071 if (Op == "+=") 1072 E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); }; 1073 return new SymbolAssignment(Name, E); 1074 } 1075 1076 // This is an operator-precedence parser to parse a linker 1077 // script expression. 1078 Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); } 1079 1080 static Expr combine(StringRef Op, Expr L, Expr R) { 1081 if (Op == "*") 1082 return [=](uint64_t Dot) { return L(Dot) * R(Dot); }; 1083 if (Op == "/") { 1084 return [=](uint64_t Dot) -> uint64_t { 1085 uint64_t RHS = R(Dot); 1086 if (RHS == 0) { 1087 error("division by zero"); 1088 return 0; 1089 } 1090 return L(Dot) / RHS; 1091 }; 1092 } 1093 if (Op == "+") 1094 return [=](uint64_t Dot) { return L(Dot) + R(Dot); }; 1095 if (Op == "-") 1096 return [=](uint64_t Dot) { return L(Dot) - R(Dot); }; 1097 if (Op == "<") 1098 return [=](uint64_t Dot) { return L(Dot) < R(Dot); }; 1099 if (Op == ">") 1100 return [=](uint64_t Dot) { return L(Dot) > R(Dot); }; 1101 if (Op == ">=") 1102 return [=](uint64_t Dot) { return L(Dot) >= R(Dot); }; 1103 if (Op == "<=") 1104 return [=](uint64_t Dot) { return L(Dot) <= R(Dot); }; 1105 if (Op == "==") 1106 return [=](uint64_t Dot) { return L(Dot) == R(Dot); }; 1107 if (Op == "!=") 1108 return [=](uint64_t Dot) { return L(Dot) != R(Dot); }; 1109 if (Op == "&") 1110 return [=](uint64_t Dot) { return L(Dot) & R(Dot); }; 1111 llvm_unreachable("invalid operator"); 1112 } 1113 1114 // This is a part of the operator-precedence parser. This function 1115 // assumes that the remaining token stream starts with an operator. 1116 Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { 1117 while (!atEOF() && !Error) { 1118 // Read an operator and an expression. 1119 StringRef Op1 = peek(); 1120 if (Op1 == "?") 1121 return readTernary(Lhs); 1122 if (precedence(Op1) < MinPrec) 1123 break; 1124 next(); 1125 Expr Rhs = readPrimary(); 1126 1127 // Evaluate the remaining part of the expression first if the 1128 // next operator has greater precedence than the previous one. 1129 // For example, if we have read "+" and "3", and if the next 1130 // operator is "*", then we'll evaluate 3 * ... part first. 1131 while (!atEOF()) { 1132 StringRef Op2 = peek(); 1133 if (precedence(Op2) <= precedence(Op1)) 1134 break; 1135 Rhs = readExpr1(Rhs, precedence(Op2)); 1136 } 1137 1138 Lhs = combine(Op1, Lhs, Rhs); 1139 } 1140 return Lhs; 1141 } 1142 1143 uint64_t static getConstant(StringRef S) { 1144 if (S == "COMMONPAGESIZE") 1145 return Target->PageSize; 1146 if (S == "MAXPAGESIZE") 1147 return Target->MaxPageSize; 1148 error("unknown constant: " + S); 1149 return 0; 1150 } 1151 1152 Expr ScriptParser::readPrimary() { 1153 if (peek() == "(") 1154 return readParenExpr(); 1155 1156 StringRef Tok = next(); 1157 1158 // Built-in functions are parsed here. 1159 // https://sourceware.org/binutils/docs/ld/Builtin-Functions.html. 1160 if (Tok == "ASSERT") 1161 return readAssert(); 1162 if (Tok == "ALIGN") { 1163 Expr E = readParenExpr(); 1164 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1165 } 1166 if (Tok == "CONSTANT") { 1167 expect("("); 1168 StringRef Tok = next(); 1169 expect(")"); 1170 return [=](uint64_t Dot) { return getConstant(Tok); }; 1171 } 1172 if (Tok == "SEGMENT_START") { 1173 expect("("); 1174 next(); 1175 expect(","); 1176 uint64_t Val; 1177 next().getAsInteger(0, Val); 1178 expect(")"); 1179 return [=](uint64_t Dot) { return Val; }; 1180 } 1181 if (Tok == "DATA_SEGMENT_ALIGN") { 1182 expect("("); 1183 Expr E = readExpr(); 1184 expect(","); 1185 readExpr(); 1186 expect(")"); 1187 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1188 } 1189 if (Tok == "DATA_SEGMENT_END") { 1190 expect("("); 1191 expect("."); 1192 expect(")"); 1193 return [](uint64_t Dot) { return Dot; }; 1194 } 1195 // GNU linkers implements more complicated logic to handle 1196 // DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to 1197 // the next page boundary for simplicity. 1198 if (Tok == "DATA_SEGMENT_RELRO_END") { 1199 expect("("); 1200 next(); 1201 expect(","); 1202 readExpr(); 1203 expect(")"); 1204 return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); }; 1205 } 1206 if (Tok == "SIZEOF") { 1207 expect("("); 1208 StringRef Name = next(); 1209 expect(")"); 1210 return [=](uint64_t Dot) { return getSectionSize(Name); }; 1211 } 1212 if (Tok == "SIZEOF_HEADERS") 1213 return [=](uint64_t Dot) { return getHeaderSize(); }; 1214 1215 // Parse a symbol name or a number literal. 1216 uint64_t V = 0; 1217 if (Tok.getAsInteger(0, V)) { 1218 if (Tok != "." && !isValidCIdentifier(Tok)) 1219 setError("malformed number: " + Tok); 1220 return [=](uint64_t Dot) { return getSymbolValue(Tok, Dot); }; 1221 } 1222 return [=](uint64_t Dot) { return V; }; 1223 } 1224 1225 Expr ScriptParser::readTernary(Expr Cond) { 1226 next(); 1227 Expr L = readExpr(); 1228 expect(":"); 1229 Expr R = readExpr(); 1230 return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); }; 1231 } 1232 1233 Expr ScriptParser::readParenExpr() { 1234 expect("("); 1235 Expr E = readExpr(); 1236 expect(")"); 1237 return E; 1238 } 1239 1240 std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() { 1241 std::vector<StringRef> Phdrs; 1242 while (!Error && peek().startswith(":")) { 1243 StringRef Tok = next(); 1244 Tok = (Tok.size() == 1) ? next() : Tok.substr(1); 1245 if (Tok.empty()) { 1246 setError("section header name is empty"); 1247 break; 1248 } 1249 Phdrs.push_back(Tok); 1250 } 1251 return Phdrs; 1252 } 1253 1254 unsigned ScriptParser::readPhdrType() { 1255 StringRef Tok = next(); 1256 unsigned Ret = StringSwitch<unsigned>(Tok) 1257 .Case("PT_NULL", PT_NULL) 1258 .Case("PT_LOAD", PT_LOAD) 1259 .Case("PT_DYNAMIC", PT_DYNAMIC) 1260 .Case("PT_INTERP", PT_INTERP) 1261 .Case("PT_NOTE", PT_NOTE) 1262 .Case("PT_SHLIB", PT_SHLIB) 1263 .Case("PT_PHDR", PT_PHDR) 1264 .Case("PT_TLS", PT_TLS) 1265 .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME) 1266 .Case("PT_GNU_STACK", PT_GNU_STACK) 1267 .Case("PT_GNU_RELRO", PT_GNU_RELRO) 1268 .Default(-1); 1269 1270 if (Ret == (unsigned)-1) { 1271 setError("invalid program header type: " + Tok); 1272 return PT_NULL; 1273 } 1274 return Ret; 1275 } 1276 1277 static bool isUnderSysroot(StringRef Path) { 1278 if (Config->Sysroot == "") 1279 return false; 1280 for (; !Path.empty(); Path = sys::path::parent_path(Path)) 1281 if (sys::fs::equivalent(Config->Sysroot, Path)) 1282 return true; 1283 return false; 1284 } 1285 1286 // Entry point. 1287 void elf::readLinkerScript(MemoryBufferRef MB) { 1288 StringRef Path = MB.getBufferIdentifier(); 1289 ScriptParser(MB.getBuffer(), isUnderSysroot(Path)).run(); 1290 } 1291 1292 template class elf::LinkerScript<ELF32LE>; 1293 template class elf::LinkerScript<ELF32BE>; 1294 template class elf::LinkerScript<ELF64LE>; 1295 template class elf::LinkerScript<ELF64BE>; 1296