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 LinkerScriptBase *elf::ScriptBase; 45 ScriptConfiguration *elf::ScriptConfig; 46 47 template <class ELFT> 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( 55 Cmd->Name, nullptr, 0, Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT); 56 Cmd->Sym = Sym->body(); 57 } 58 59 template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) { 60 if (Cmd->IsAbsolute) 61 addRegular<ELFT>(Cmd); 62 else 63 addSynthetic<ELFT>(Cmd); 64 } 65 // If a symbol was in PROVIDE(), we need to define it only when 66 // it is an undefined symbol. 67 template <class ELFT> static bool shouldDefine(SymbolAssignment *Cmd) { 68 if (Cmd->Name == ".") 69 return false; 70 if (!Cmd->Provide) 71 return true; 72 SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name); 73 return B && B->isUndefined(); 74 } 75 76 bool SymbolAssignment::classof(const BaseCommand *C) { 77 return C->Kind == AssignmentKind; 78 } 79 80 bool OutputSectionCommand::classof(const BaseCommand *C) { 81 return C->Kind == OutputSectionKind; 82 } 83 84 bool InputSectionDescription::classof(const BaseCommand *C) { 85 return C->Kind == InputSectionKind; 86 } 87 88 bool AssertCommand::classof(const BaseCommand *C) { 89 return C->Kind == AssertKind; 90 } 91 92 template <class ELFT> static bool isDiscarded(InputSectionBase<ELFT> *S) { 93 return !S || !S->Live; 94 } 95 96 template <class ELFT> LinkerScript<ELFT>::LinkerScript() {} 97 template <class ELFT> LinkerScript<ELFT>::~LinkerScript() {} 98 99 template <class ELFT> 100 bool LinkerScript<ELFT>::shouldKeep(InputSectionBase<ELFT> *S) { 101 for (Regex *Re : Opt.KeptSections) 102 if (Re->match(S->Name)) 103 return true; 104 return false; 105 } 106 107 static bool fileMatches(const InputSectionDescription *Desc, 108 StringRef Filename) { 109 return const_cast<Regex &>(Desc->FileRe).match(Filename) && 110 !const_cast<Regex &>(Desc->ExcludedFileRe).match(Filename); 111 } 112 113 // Returns input sections filtered by given glob patterns. 114 template <class ELFT> 115 std::vector<InputSectionBase<ELFT> *> 116 LinkerScript<ELFT>::getInputSections(const InputSectionDescription *I) { 117 const Regex &Re = I->SectionRe; 118 std::vector<InputSectionBase<ELFT> *> Ret; 119 for (const std::unique_ptr<ObjectFile<ELFT>> &F : 120 Symtab<ELFT>::X->getObjectFiles()) { 121 if (fileMatches(I, sys::path::filename(F->getName()))) 122 for (InputSectionBase<ELFT> *S : F->getSections()) 123 if (!isDiscarded(S) && !S->OutSec && 124 const_cast<Regex &>(Re).match(S->Name)) 125 Ret.push_back(S); 126 } 127 128 if (const_cast<Regex &>(Re).match("COMMON")) 129 Ret.push_back(CommonInputSection<ELFT>::X); 130 return Ret; 131 } 132 133 template <class ELFT> 134 static bool compareName(InputSectionBase<ELFT> *A, InputSectionBase<ELFT> *B) { 135 return A->Name < B->Name; 136 } 137 138 template <class ELFT> 139 static bool compareAlignment(InputSectionBase<ELFT> *A, 140 InputSectionBase<ELFT> *B) { 141 // ">" is not a mistake. Larger alignments are placed before smaller 142 // alignments in order to reduce the amount of padding necessary. 143 // This is compatible with GNU. 144 return A->Alignment > B->Alignment; 145 } 146 147 template <class ELFT> 148 static std::function<bool(InputSectionBase<ELFT> *, InputSectionBase<ELFT> *)> 149 getComparator(SortKind K) { 150 if (K == SortByName) 151 return compareName<ELFT>; 152 return compareAlignment<ELFT>; 153 } 154 155 template <class ELFT> 156 void LinkerScript<ELFT>::discard(OutputSectionCommand &Cmd) { 157 for (const std::unique_ptr<BaseCommand> &Base : Cmd.Commands) { 158 if (auto *Cmd = dyn_cast<InputSectionDescription>(Base.get())) { 159 for (InputSectionBase<ELFT> *S : getInputSections(Cmd)) { 160 S->Live = false; 161 reportDiscarded(S); 162 } 163 } 164 } 165 } 166 167 static bool checkConstraint(uint64_t Flags, ConstraintKind Kind) { 168 bool RO = (Kind == ConstraintKind::ReadOnly); 169 bool RW = (Kind == ConstraintKind::ReadWrite); 170 bool Writable = Flags & SHF_WRITE; 171 return !(RO && Writable) && !(RW && !Writable); 172 } 173 174 template <class ELFT> 175 static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections, 176 ConstraintKind Kind) { 177 if (Kind == ConstraintKind::NoConstraint) 178 return true; 179 return llvm::all_of(Sections, [=](InputSectionBase<ELFT> *Sec) { 180 return checkConstraint(Sec->getSectionHdr()->sh_flags, Kind); 181 }); 182 } 183 184 template <class ELFT> 185 std::vector<InputSectionBase<ELFT> *> 186 LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) { 187 std::vector<InputSectionBase<ELFT> *> Ret; 188 DenseSet<InputSectionBase<ELFT> *> SectionIndex; 189 190 for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) { 191 if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) { 192 if (shouldDefine<ELFT>(OutCmd)) 193 addSymbol<ELFT>(OutCmd); 194 OutCmd->GoesAfter = Ret.empty() ? nullptr : Ret.back(); 195 continue; 196 } 197 198 auto *Cmd = cast<InputSectionDescription>(Base.get()); 199 std::vector<InputSectionBase<ELFT> *> V = getInputSections(Cmd); 200 if (!matchConstraints<ELFT>(V, OutCmd.Constraint)) 201 continue; 202 if (Cmd->SortInner) 203 std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortInner)); 204 if (Cmd->SortOuter) 205 std::stable_sort(V.begin(), V.end(), getComparator<ELFT>(Cmd->SortOuter)); 206 207 // Add all input sections corresponding to rule 'Cmd' to 208 // resulting vector. We do not add duplicate input sections. 209 for (InputSectionBase<ELFT> *S : V) 210 if (SectionIndex.insert(S).second) 211 Ret.push_back(S); 212 } 213 return Ret; 214 } 215 216 template <class ELFT> void LinkerScript<ELFT>::createAssignments() { 217 for (const std::unique_ptr<SymbolAssignment> &Cmd : Opt.Assignments) { 218 if (shouldDefine<ELFT>(Cmd.get())) 219 addRegular<ELFT>(Cmd.get()); 220 if (Cmd->Sym) 221 cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(0); 222 } 223 } 224 225 template <class ELFT> 226 void LinkerScript<ELFT>::createSections(OutputSectionFactory<ELFT> &Factory) { 227 for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) { 228 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) { 229 if (shouldDefine<ELFT>(Cmd)) 230 addRegular<ELFT>(Cmd); 231 continue; 232 } 233 234 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) { 235 if (Cmd->Name == "/DISCARD/") { 236 discard(*Cmd); 237 continue; 238 } 239 240 std::vector<InputSectionBase<ELFT> *> V = createInputSectionList(*Cmd); 241 if (V.empty()) 242 continue; 243 244 for (InputSectionBase<ELFT> *Sec : V) { 245 OutputSectionBase<ELFT> *OutSec; 246 bool IsNew; 247 std::tie(OutSec, IsNew) = Factory.create(Sec, Cmd->Name); 248 if (IsNew) 249 OutputSections->push_back(OutSec); 250 251 uint32_t Subalign = Cmd->SubalignExpr ? Cmd->SubalignExpr(0) : 0; 252 253 if (Subalign) 254 Sec->Alignment = Subalign; 255 OutSec->addSection(Sec); 256 } 257 } 258 } 259 260 // Add orphan sections. 261 for (const std::unique_ptr<ObjectFile<ELFT>> &F : 262 Symtab<ELFT>::X->getObjectFiles()) { 263 for (InputSectionBase<ELFT> *S : F->getSections()) { 264 if (isDiscarded(S) || S->OutSec) 265 continue; 266 OutputSectionBase<ELFT> *OutSec; 267 bool IsNew; 268 std::tie(OutSec, IsNew) = Factory.create(S, getOutputSectionName(S)); 269 if (IsNew) 270 OutputSections->push_back(OutSec); 271 OutSec->addSection(S); 272 } 273 } 274 } 275 276 // Sets value of a section-defined symbol. Two kinds of 277 // symbols are processed: synthetic symbols, whose value 278 // is an offset from beginning of section and regular 279 // symbols whose value is absolute. 280 template <class ELFT> 281 static void assignSectionSymbol(SymbolAssignment *Cmd, 282 OutputSectionBase<ELFT> *Sec, 283 typename ELFT::uint Off) { 284 if (!Cmd->Sym) 285 return; 286 287 if (auto *Body = dyn_cast<DefinedSynthetic<ELFT>>(Cmd->Sym)) { 288 Body->Section = Sec; 289 Body->Value = Cmd->Expression(Sec->getVA() + Off) - Sec->getVA(); 290 return; 291 } 292 auto *Body = cast<DefinedRegular<ELFT>>(Cmd->Sym); 293 Body->Value = Cmd->Expression(Sec->getVA() + Off); 294 } 295 296 // Linker script may define start and end symbols for special section types, 297 // like .got, .eh_frame_hdr, .eh_frame and others. Those sections are not a list 298 // of regular input input sections, therefore our way of defining symbols for 299 // regular sections will not work. The approach we use for special section types 300 // is not perfect - it handles only start and end symbols. 301 template <class ELFT> 302 void addStartEndSymbols(OutputSectionCommand *Cmd, 303 OutputSectionBase<ELFT> *Sec) { 304 bool Start = true; 305 BaseCommand *PrevCmd = nullptr; 306 307 for (std::unique_ptr<BaseCommand> &Base : Cmd->Commands) { 308 if (auto *AssignCmd = dyn_cast<SymbolAssignment>(Base.get())) { 309 assignSectionSymbol<ELFT>(AssignCmd, Sec, Start ? 0 : Sec->getSize()); 310 } else { 311 if (!Start && isa<SymbolAssignment>(PrevCmd)) 312 error("section '" + Sec->getName() + 313 "' supports only start and end symbols"); 314 Start = false; 315 } 316 PrevCmd = Base.get(); 317 } 318 } 319 320 template <class ELFT> 321 void assignOffsets(OutputSectionCommand *Cmd, OutputSectionBase<ELFT> *Sec) { 322 auto *OutSec = dyn_cast<OutputSection<ELFT>>(Sec); 323 if (!OutSec) { 324 Sec->assignOffsets(); 325 // This section is not regular output section. However linker script may 326 // have defined start/end symbols for it. This case is handled below. 327 addStartEndSymbols(Cmd, Sec); 328 return; 329 } 330 typedef typename ELFT::uint uintX_t; 331 uintX_t Off = 0; 332 auto ItCmd = Cmd->Commands.begin(); 333 334 // Assigns values to all symbols following the given 335 // input section 'D' in output section 'Sec'. When symbols 336 // are in the beginning of output section the value of 'D' 337 // is nullptr. 338 auto AssignSuccessors = [&](InputSectionData *D) { 339 for (; ItCmd != Cmd->Commands.end(); ++ItCmd) { 340 auto *AssignCmd = dyn_cast<SymbolAssignment>(ItCmd->get()); 341 if (!AssignCmd) 342 continue; 343 if (D != AssignCmd->GoesAfter) 344 break; 345 346 if (AssignCmd->Name == ".") { 347 // Update to location counter means update to section size. 348 Off = AssignCmd->Expression(Sec->getVA() + Off) - Sec->getVA(); 349 Sec->setSize(Off); 350 continue; 351 } 352 assignSectionSymbol<ELFT>(AssignCmd, Sec, Off); 353 } 354 }; 355 356 AssignSuccessors(nullptr); 357 for (InputSection<ELFT> *I : OutSec->Sections) { 358 Off = alignTo(Off, I->Alignment); 359 I->OutSecOff = Off; 360 Off += I->getSize(); 361 // Update section size inside for-loop, so that SIZEOF 362 // works correctly in the case below: 363 // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) } 364 Sec->setSize(Off); 365 // Add symbols following current input section. 366 AssignSuccessors(I); 367 } 368 } 369 370 template <class ELFT> 371 static std::vector<OutputSectionBase<ELFT> *> 372 findSections(OutputSectionCommand &Cmd, 373 ArrayRef<OutputSectionBase<ELFT> *> Sections) { 374 std::vector<OutputSectionBase<ELFT> *> Ret; 375 for (OutputSectionBase<ELFT> *Sec : Sections) 376 if (Sec->getName() == Cmd.Name && 377 checkConstraint(Sec->getFlags(), Cmd.Constraint)) 378 Ret.push_back(Sec); 379 return Ret; 380 } 381 382 template <class ELFT> void LinkerScript<ELFT>::assignAddresses() { 383 // Orphan sections are sections present in the input files which 384 // are not explicitly placed into the output file by the linker script. 385 // We place orphan sections at end of file. 386 // Other linkers places them using some heuristics as described in 387 // https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections. 388 for (OutputSectionBase<ELFT> *Sec : *OutputSections) { 389 StringRef Name = Sec->getName(); 390 if (getSectionIndex(Name) == INT_MAX) 391 Opt.Commands.push_back(llvm::make_unique<OutputSectionCommand>(Name)); 392 } 393 394 // Assign addresses as instructed by linker script SECTIONS sub-commands. 395 Dot = getHeaderSize(); 396 uintX_t MinVA = std::numeric_limits<uintX_t>::max(); 397 uintX_t ThreadBssOffset = 0; 398 399 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 400 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) { 401 if (Cmd->Name == ".") { 402 Dot = Cmd->Expression(Dot); 403 } else if (Cmd->Sym) { 404 cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Cmd->Expression(Dot); 405 } 406 continue; 407 } 408 409 if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) { 410 Cmd->Expression(Dot); 411 continue; 412 } 413 414 auto *Cmd = cast<OutputSectionCommand>(Base.get()); 415 for (OutputSectionBase<ELFT> *Sec : 416 findSections<ELFT>(*Cmd, *OutputSections)) { 417 418 if (Cmd->AddrExpr) 419 Dot = Cmd->AddrExpr(Dot); 420 421 if (Cmd->AlignExpr) 422 Sec->updateAlignment(Cmd->AlignExpr(Dot)); 423 424 if ((Sec->getFlags() & SHF_TLS) && Sec->getType() == SHT_NOBITS) { 425 uintX_t TVA = Dot + ThreadBssOffset; 426 TVA = alignTo(TVA, Sec->getAlignment()); 427 Sec->setVA(TVA); 428 assignOffsets(Cmd, Sec); 429 ThreadBssOffset = TVA - Dot + Sec->getSize(); 430 continue; 431 } 432 433 if (!(Sec->getFlags() & SHF_ALLOC)) { 434 assignOffsets(Cmd, Sec); 435 continue; 436 } 437 438 Dot = alignTo(Dot, Sec->getAlignment()); 439 Sec->setVA(Dot); 440 assignOffsets(Cmd, Sec); 441 MinVA = std::min(MinVA, Dot); 442 Dot += Sec->getSize(); 443 } 444 } 445 446 // ELF and Program headers need to be right before the first section in 447 // memory. Set their addresses accordingly. 448 MinVA = alignDown(MinVA - Out<ELFT>::ElfHeader->getSize() - 449 Out<ELFT>::ProgramHeaders->getSize(), 450 Target->PageSize); 451 Out<ELFT>::ElfHeader->setVA(MinVA); 452 Out<ELFT>::ProgramHeaders->setVA(Out<ELFT>::ElfHeader->getSize() + MinVA); 453 } 454 455 // Creates program headers as instructed by PHDRS linker script command. 456 template <class ELFT> 457 std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() { 458 std::vector<PhdrEntry<ELFT>> Ret; 459 460 // Process PHDRS and FILEHDR keywords because they are not 461 // real output sections and cannot be added in the following loop. 462 for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) { 463 Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags); 464 PhdrEntry<ELFT> &Phdr = Ret.back(); 465 466 if (Cmd.HasFilehdr) 467 Phdr.add(Out<ELFT>::ElfHeader); 468 if (Cmd.HasPhdrs) 469 Phdr.add(Out<ELFT>::ProgramHeaders); 470 } 471 472 // Add output sections to program headers. 473 PhdrEntry<ELFT> *Load = nullptr; 474 uintX_t Flags = PF_R; 475 for (OutputSectionBase<ELFT> *Sec : *OutputSections) { 476 if (!(Sec->getFlags() & SHF_ALLOC)) 477 break; 478 479 std::vector<size_t> PhdrIds = getPhdrIndices(Sec->getName()); 480 if (!PhdrIds.empty()) { 481 // Assign headers specified by linker script 482 for (size_t Id : PhdrIds) { 483 Ret[Id].add(Sec); 484 if (Opt.PhdrsCommands[Id].Flags == UINT_MAX) 485 Ret[Id].H.p_flags |= Sec->getPhdrFlags(); 486 } 487 } else { 488 // If we have no load segment or flags've changed then we want new load 489 // segment. 490 uintX_t NewFlags = Sec->getPhdrFlags(); 491 if (Load == nullptr || Flags != NewFlags) { 492 Load = &*Ret.emplace(Ret.end(), PT_LOAD, NewFlags); 493 Flags = NewFlags; 494 } 495 Load->add(Sec); 496 } 497 } 498 return Ret; 499 } 500 501 template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() { 502 // Ignore .interp section in case we have PHDRS specification 503 // and PT_INTERP isn't listed. 504 return !Opt.PhdrsCommands.empty() && 505 llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) { 506 return Cmd.Type == PT_INTERP; 507 }) == Opt.PhdrsCommands.end(); 508 } 509 510 template <class ELFT> 511 ArrayRef<uint8_t> LinkerScript<ELFT>::getFiller(StringRef Name) { 512 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 513 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 514 if (Cmd->Name == Name) 515 return Cmd->Filler; 516 return {}; 517 } 518 519 template <class ELFT> Expr LinkerScript<ELFT>::getLma(StringRef Name) { 520 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 521 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 522 if (Cmd->LmaExpr && Cmd->Name == Name) 523 return Cmd->LmaExpr; 524 return {}; 525 } 526 527 // Returns the index of the given section name in linker script 528 // SECTIONS commands. Sections are laid out as the same order as they 529 // were in the script. If a given name did not appear in the script, 530 // it returns INT_MAX, so that it will be laid out at end of file. 531 template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) { 532 int I = 0; 533 for (std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 534 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 535 if (Cmd->Name == Name) 536 return I; 537 ++I; 538 } 539 return INT_MAX; 540 } 541 542 // A compartor to sort output sections. Returns -1 or 1 if 543 // A or B are mentioned in linker script. Otherwise, returns 0. 544 template <class ELFT> 545 int LinkerScript<ELFT>::compareSections(StringRef A, StringRef B) { 546 int I = getSectionIndex(A); 547 int J = getSectionIndex(B); 548 if (I == INT_MAX && J == INT_MAX) 549 return 0; 550 return I < J ? -1 : 1; 551 } 552 553 template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() { 554 return !Opt.PhdrsCommands.empty(); 555 } 556 557 template <class ELFT> 558 uint64_t LinkerScript<ELFT>::getOutputSectionAddress(StringRef Name) { 559 for (OutputSectionBase<ELFT> *Sec : *OutputSections) 560 if (Sec->getName() == Name) 561 return Sec->getVA(); 562 error("undefined section " + Name); 563 return 0; 564 } 565 566 template <class ELFT> 567 uint64_t LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) { 568 for (OutputSectionBase<ELFT> *Sec : *OutputSections) 569 if (Sec->getName() == Name) 570 return Sec->getSize(); 571 error("undefined section " + Name); 572 return 0; 573 } 574 575 template <class ELFT> 576 uint64_t LinkerScript<ELFT>::getOutputSectionAlign(StringRef Name) { 577 for (OutputSectionBase<ELFT> *Sec : *OutputSections) 578 if (Sec->getName() == Name) 579 return Sec->getAlignment(); 580 error("undefined section " + Name); 581 return 0; 582 } 583 584 template <class ELFT> uint64_t LinkerScript<ELFT>::getHeaderSize() { 585 return Out<ELFT>::ElfHeader->getSize() + Out<ELFT>::ProgramHeaders->getSize(); 586 } 587 588 template <class ELFT> uint64_t LinkerScript<ELFT>::getSymbolValue(StringRef S) { 589 if (SymbolBody *B = Symtab<ELFT>::X->find(S)) 590 return B->getVA<ELFT>(); 591 error("symbol not found: " + S); 592 return 0; 593 } 594 595 // Returns indices of ELF headers containing specific section, identified 596 // by Name. Each index is a zero based number of ELF header listed within 597 // PHDRS {} script block. 598 template <class ELFT> 599 std::vector<size_t> LinkerScript<ELFT>::getPhdrIndices(StringRef SectionName) { 600 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 601 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 602 if (!Cmd || Cmd->Name != SectionName) 603 continue; 604 605 std::vector<size_t> Ret; 606 for (StringRef PhdrName : Cmd->Phdrs) 607 Ret.push_back(getPhdrIndex(PhdrName)); 608 return Ret; 609 } 610 return {}; 611 } 612 613 template <class ELFT> 614 size_t LinkerScript<ELFT>::getPhdrIndex(StringRef PhdrName) { 615 size_t I = 0; 616 for (PhdrsCommand &Cmd : Opt.PhdrsCommands) { 617 if (Cmd.Name == PhdrName) 618 return I; 619 ++I; 620 } 621 error("section header '" + PhdrName + "' is not listed in PHDRS"); 622 return 0; 623 } 624 625 class elf::ScriptParser : public ScriptParserBase { 626 typedef void (ScriptParser::*Handler)(); 627 628 public: 629 ScriptParser(StringRef S, bool B) : ScriptParserBase(S), IsUnderSysroot(B) {} 630 631 void readLinkerScript(); 632 void readVersionScript(); 633 634 private: 635 void addFile(StringRef Path); 636 637 void readAsNeeded(); 638 void readEntry(); 639 void readExtern(); 640 void readGroup(); 641 void readInclude(); 642 void readOutput(); 643 void readOutputArch(); 644 void readOutputFormat(); 645 void readPhdrs(); 646 void readSearchDir(); 647 void readSections(); 648 void readVersion(); 649 void readVersionScriptCommand(); 650 651 SymbolAssignment *readAssignment(StringRef Name); 652 std::vector<uint8_t> readFill(); 653 OutputSectionCommand *readOutputSectionDescription(StringRef OutSec); 654 std::vector<uint8_t> readOutputSectionFiller(StringRef Tok); 655 std::vector<StringRef> readOutputSectionPhdrs(); 656 InputSectionDescription *readInputSectionDescription(StringRef Tok); 657 Regex readFilePatterns(); 658 InputSectionDescription *readInputSectionRules(StringRef FilePattern); 659 unsigned readPhdrType(); 660 SortKind readSortKind(); 661 SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); 662 SymbolAssignment *readProvideOrAssignment(StringRef Tok, bool MakeAbsolute); 663 void readSort(); 664 Expr readAssert(); 665 666 Expr readExpr(); 667 Expr readExpr1(Expr Lhs, int MinPrec); 668 Expr readPrimary(); 669 Expr readTernary(Expr Cond); 670 Expr readParenExpr(); 671 672 // For parsing version script. 673 void readExtern(std::vector<SymbolVersion> *Globals); 674 void readVersionDeclaration(StringRef VerStr); 675 void readGlobal(StringRef VerStr); 676 void readLocal(); 677 678 ScriptConfiguration &Opt = *ScriptConfig; 679 StringSaver Saver = {ScriptConfig->Alloc}; 680 bool IsUnderSysroot; 681 }; 682 683 void ScriptParser::readVersionScript() { 684 readVersionScriptCommand(); 685 if (!atEOF()) 686 setError("EOF expected, but got " + next()); 687 } 688 689 void ScriptParser::readVersionScriptCommand() { 690 if (skip("{")) { 691 readVersionDeclaration(""); 692 return; 693 } 694 695 while (!atEOF() && !Error && peek() != "}") { 696 StringRef VerStr = next(); 697 if (VerStr == "{") { 698 setError("anonymous version definition is used in " 699 "combination with other version definitions"); 700 return; 701 } 702 expect("{"); 703 readVersionDeclaration(VerStr); 704 } 705 } 706 707 void ScriptParser::readVersion() { 708 expect("{"); 709 readVersionScriptCommand(); 710 expect("}"); 711 } 712 713 void ScriptParser::readLinkerScript() { 714 while (!atEOF()) { 715 StringRef Tok = next(); 716 if (Tok == ";") 717 continue; 718 719 if (Tok == "ENTRY") { 720 readEntry(); 721 } else if (Tok == "EXTERN") { 722 readExtern(); 723 } else if (Tok == "GROUP" || Tok == "INPUT") { 724 readGroup(); 725 } else if (Tok == "INCLUDE") { 726 readInclude(); 727 } else if (Tok == "OUTPUT") { 728 readOutput(); 729 } else if (Tok == "OUTPUT_ARCH") { 730 readOutputArch(); 731 } else if (Tok == "OUTPUT_FORMAT") { 732 readOutputFormat(); 733 } else if (Tok == "PHDRS") { 734 readPhdrs(); 735 } else if (Tok == "SEARCH_DIR") { 736 readSearchDir(); 737 } else if (Tok == "SECTIONS") { 738 readSections(); 739 } else if (Tok == "VERSION") { 740 readVersion(); 741 } else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok, true)) { 742 if (Opt.HasContents) 743 Opt.Commands.emplace_back(Cmd); 744 else 745 Opt.Assignments.emplace_back(Cmd); 746 } else { 747 setError("unknown directive: " + Tok); 748 } 749 } 750 } 751 752 void ScriptParser::addFile(StringRef S) { 753 if (IsUnderSysroot && S.startswith("/")) { 754 SmallString<128> Path; 755 (Config->Sysroot + S).toStringRef(Path); 756 if (sys::fs::exists(Path)) { 757 Driver->addFile(Saver.save(Path.str())); 758 return; 759 } 760 } 761 762 if (sys::path::is_absolute(S)) { 763 Driver->addFile(S); 764 } else if (S.startswith("=")) { 765 if (Config->Sysroot.empty()) 766 Driver->addFile(S.substr(1)); 767 else 768 Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1))); 769 } else if (S.startswith("-l")) { 770 Driver->addLibrary(S.substr(2)); 771 } else if (sys::fs::exists(S)) { 772 Driver->addFile(S); 773 } else { 774 std::string Path = findFromSearchPaths(S); 775 if (Path.empty()) 776 setError("unable to find " + S); 777 else 778 Driver->addFile(Saver.save(Path)); 779 } 780 } 781 782 void ScriptParser::readAsNeeded() { 783 expect("("); 784 bool Orig = Config->AsNeeded; 785 Config->AsNeeded = true; 786 while (!Error && !skip(")")) 787 addFile(next()); 788 Config->AsNeeded = Orig; 789 } 790 791 void ScriptParser::readEntry() { 792 // -e <symbol> takes predecence over ENTRY(<symbol>). 793 expect("("); 794 StringRef Tok = next(); 795 if (Config->Entry.empty()) 796 Config->Entry = Tok; 797 expect(")"); 798 } 799 800 void ScriptParser::readExtern() { 801 expect("("); 802 while (!Error && !skip(")")) 803 Config->Undefined.push_back(next()); 804 } 805 806 void ScriptParser::readGroup() { 807 expect("("); 808 while (!Error && !skip(")")) { 809 StringRef Tok = next(); 810 if (Tok == "AS_NEEDED") 811 readAsNeeded(); 812 else 813 addFile(Tok); 814 } 815 } 816 817 void ScriptParser::readInclude() { 818 StringRef Tok = next(); 819 auto MBOrErr = MemoryBuffer::getFile(Tok); 820 if (!MBOrErr) { 821 setError("cannot open " + Tok); 822 return; 823 } 824 std::unique_ptr<MemoryBuffer> &MB = *MBOrErr; 825 StringRef S = Saver.save(MB->getMemBufferRef().getBuffer()); 826 std::vector<StringRef> V = tokenize(S); 827 Tokens.insert(Tokens.begin() + Pos, V.begin(), V.end()); 828 } 829 830 void ScriptParser::readOutput() { 831 // -o <file> takes predecence over OUTPUT(<file>). 832 expect("("); 833 StringRef Tok = next(); 834 if (Config->OutputFile.empty()) 835 Config->OutputFile = Tok; 836 expect(")"); 837 } 838 839 void ScriptParser::readOutputArch() { 840 // Error checking only for now. 841 expect("("); 842 next(); 843 expect(")"); 844 } 845 846 void ScriptParser::readOutputFormat() { 847 // Error checking only for now. 848 expect("("); 849 next(); 850 StringRef Tok = next(); 851 if (Tok == ")") 852 return; 853 if (Tok != ",") { 854 setError("unexpected token: " + Tok); 855 return; 856 } 857 next(); 858 expect(","); 859 next(); 860 expect(")"); 861 } 862 863 void ScriptParser::readPhdrs() { 864 expect("{"); 865 while (!Error && !skip("}")) { 866 StringRef Tok = next(); 867 Opt.PhdrsCommands.push_back({Tok, PT_NULL, false, false, UINT_MAX}); 868 PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back(); 869 870 PhdrCmd.Type = readPhdrType(); 871 do { 872 Tok = next(); 873 if (Tok == ";") 874 break; 875 if (Tok == "FILEHDR") 876 PhdrCmd.HasFilehdr = true; 877 else if (Tok == "PHDRS") 878 PhdrCmd.HasPhdrs = true; 879 else if (Tok == "FLAGS") { 880 expect("("); 881 // Passing 0 for the value of dot is a bit of a hack. It means that 882 // we accept expressions like ".|1". 883 PhdrCmd.Flags = readExpr()(0); 884 expect(")"); 885 } else 886 setError("unexpected header attribute: " + Tok); 887 } while (!Error); 888 } 889 } 890 891 void ScriptParser::readSearchDir() { 892 expect("("); 893 if (!Config->Nostdlib) 894 Config->SearchPaths.push_back(next()); 895 expect(")"); 896 } 897 898 void ScriptParser::readSections() { 899 Opt.HasContents = true; 900 expect("{"); 901 while (!Error && !skip("}")) { 902 StringRef Tok = next(); 903 BaseCommand *Cmd = readProvideOrAssignment(Tok, true); 904 if (!Cmd) { 905 if (Tok == "ASSERT") 906 Cmd = new AssertCommand(readAssert()); 907 else 908 Cmd = readOutputSectionDescription(Tok); 909 } 910 Opt.Commands.emplace_back(Cmd); 911 } 912 } 913 914 static int precedence(StringRef Op) { 915 return StringSwitch<int>(Op) 916 .Case("*", 4) 917 .Case("/", 4) 918 .Case("+", 3) 919 .Case("-", 3) 920 .Case("<", 2) 921 .Case(">", 2) 922 .Case(">=", 2) 923 .Case("<=", 2) 924 .Case("==", 2) 925 .Case("!=", 2) 926 .Case("&", 1) 927 .Case("|", 1) 928 .Default(-1); 929 } 930 931 Regex ScriptParser::readFilePatterns() { 932 std::vector<StringRef> V; 933 while (!Error && !skip(")")) 934 V.push_back(next()); 935 return compileGlobPatterns(V); 936 } 937 938 SortKind ScriptParser::readSortKind() { 939 if (skip("SORT") || skip("SORT_BY_NAME")) 940 return SortByName; 941 if (skip("SORT_BY_ALIGNMENT")) 942 return SortByAlignment; 943 return SortNone; 944 } 945 946 InputSectionDescription * 947 ScriptParser::readInputSectionRules(StringRef FilePattern) { 948 auto *Cmd = new InputSectionDescription(FilePattern); 949 expect("("); 950 951 // Read EXCLUDE_FILE(). 952 if (skip("EXCLUDE_FILE")) { 953 expect("("); 954 Cmd->ExcludedFileRe = readFilePatterns(); 955 } 956 957 // Read SORT(). 958 if (SortKind K1 = readSortKind()) { 959 Cmd->SortOuter = K1; 960 expect("("); 961 if (SortKind K2 = readSortKind()) { 962 Cmd->SortInner = K2; 963 expect("("); 964 Cmd->SectionRe = readFilePatterns(); 965 expect(")"); 966 } else { 967 Cmd->SectionRe = readFilePatterns(); 968 } 969 expect(")"); 970 return Cmd; 971 } 972 973 Cmd->SectionRe = readFilePatterns(); 974 return Cmd; 975 } 976 977 InputSectionDescription * 978 ScriptParser::readInputSectionDescription(StringRef Tok) { 979 // Input section wildcard can be surrounded by KEEP. 980 // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep 981 if (Tok == "KEEP") { 982 expect("("); 983 StringRef FilePattern = next(); 984 InputSectionDescription *Cmd = readInputSectionRules(FilePattern); 985 expect(")"); 986 Opt.KeptSections.push_back(&Cmd->SectionRe); 987 return Cmd; 988 } 989 return readInputSectionRules(Tok); 990 } 991 992 void ScriptParser::readSort() { 993 expect("("); 994 expect("CONSTRUCTORS"); 995 expect(")"); 996 } 997 998 Expr ScriptParser::readAssert() { 999 expect("("); 1000 Expr E = readExpr(); 1001 expect(","); 1002 StringRef Msg = next(); 1003 expect(")"); 1004 return [=](uint64_t Dot) { 1005 uint64_t V = E(Dot); 1006 if (!V) 1007 error(Msg); 1008 return V; 1009 }; 1010 } 1011 1012 // Reads a FILL(expr) command. We handle the FILL command as an 1013 // alias for =fillexp section attribute, which is different from 1014 // what GNU linkers do. 1015 // https://sourceware.org/binutils/docs/ld/Output-Section-Data.html 1016 std::vector<uint8_t> ScriptParser::readFill() { 1017 expect("("); 1018 std::vector<uint8_t> V = readOutputSectionFiller(next()); 1019 expect(")"); 1020 expect(";"); 1021 return V; 1022 } 1023 1024 OutputSectionCommand * 1025 ScriptParser::readOutputSectionDescription(StringRef OutSec) { 1026 OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec); 1027 1028 // Read an address expression. 1029 // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address 1030 if (peek() != ":") 1031 Cmd->AddrExpr = readExpr(); 1032 1033 expect(":"); 1034 1035 if (skip("AT")) 1036 Cmd->LmaExpr = readParenExpr(); 1037 if (skip("ALIGN")) 1038 Cmd->AlignExpr = readParenExpr(); 1039 if (skip("SUBALIGN")) 1040 Cmd->SubalignExpr = readParenExpr(); 1041 1042 // Parse constraints. 1043 if (skip("ONLY_IF_RO")) 1044 Cmd->Constraint = ConstraintKind::ReadOnly; 1045 if (skip("ONLY_IF_RW")) 1046 Cmd->Constraint = ConstraintKind::ReadWrite; 1047 expect("{"); 1048 1049 while (!Error && !skip("}")) { 1050 StringRef Tok = next(); 1051 if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok, false)) 1052 Cmd->Commands.emplace_back(Assignment); 1053 else if (Tok == "FILL") 1054 Cmd->Filler = readFill(); 1055 else if (Tok == "SORT") 1056 readSort(); 1057 else if (peek() == "(") 1058 Cmd->Commands.emplace_back(readInputSectionDescription(Tok)); 1059 else 1060 setError("unknown command " + Tok); 1061 } 1062 Cmd->Phdrs = readOutputSectionPhdrs(); 1063 if (peek().startswith("=")) 1064 Cmd->Filler = readOutputSectionFiller(next().drop_front()); 1065 return Cmd; 1066 } 1067 1068 // Read "=<number>" where <number> is an octal/decimal/hexadecimal number. 1069 // https://sourceware.org/binutils/docs/ld/Output-Section-Fill.html 1070 // 1071 // ld.gold is not fully compatible with ld.bfd. ld.bfd handles 1072 // hexstrings as blobs of arbitrary sizes, while ld.gold handles them 1073 // as 32-bit big-endian values. We will do the same as ld.gold does 1074 // because it's simpler than what ld.bfd does. 1075 std::vector<uint8_t> ScriptParser::readOutputSectionFiller(StringRef Tok) { 1076 uint32_t V; 1077 if (Tok.getAsInteger(0, V)) { 1078 setError("invalid filler expression: " + Tok); 1079 return {}; 1080 } 1081 return {uint8_t(V >> 24), uint8_t(V >> 16), uint8_t(V >> 8), uint8_t(V)}; 1082 } 1083 1084 SymbolAssignment *ScriptParser::readProvideHidden(bool Provide, bool Hidden) { 1085 expect("("); 1086 SymbolAssignment *Cmd = readAssignment(next()); 1087 Cmd->Provide = Provide; 1088 Cmd->Hidden = Hidden; 1089 expect(")"); 1090 expect(";"); 1091 return Cmd; 1092 } 1093 1094 SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok, 1095 bool MakeAbsolute) { 1096 SymbolAssignment *Cmd = nullptr; 1097 if (peek() == "=" || peek() == "+=") { 1098 Cmd = readAssignment(Tok); 1099 expect(";"); 1100 } else if (Tok == "PROVIDE") { 1101 Cmd = readProvideHidden(true, false); 1102 } else if (Tok == "HIDDEN") { 1103 Cmd = readProvideHidden(false, true); 1104 } else if (Tok == "PROVIDE_HIDDEN") { 1105 Cmd = readProvideHidden(true, true); 1106 } 1107 if (Cmd && MakeAbsolute) 1108 Cmd->IsAbsolute = true; 1109 return Cmd; 1110 } 1111 1112 static uint64_t getSymbolValue(StringRef S, uint64_t Dot) { 1113 if (S == ".") 1114 return Dot; 1115 return ScriptBase->getSymbolValue(S); 1116 } 1117 1118 SymbolAssignment *ScriptParser::readAssignment(StringRef Name) { 1119 StringRef Op = next(); 1120 bool IsAbsolute = false; 1121 Expr E; 1122 assert(Op == "=" || Op == "+="); 1123 if (skip("ABSOLUTE")) { 1124 E = readParenExpr(); 1125 IsAbsolute = true; 1126 } else { 1127 E = readExpr(); 1128 } 1129 if (Op == "+=") 1130 E = [=](uint64_t Dot) { return getSymbolValue(Name, Dot) + E(Dot); }; 1131 return new SymbolAssignment(Name, E, IsAbsolute); 1132 } 1133 1134 // This is an operator-precedence parser to parse a linker 1135 // script expression. 1136 Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); } 1137 1138 static Expr combine(StringRef Op, Expr L, Expr R) { 1139 if (Op == "*") 1140 return [=](uint64_t Dot) { return L(Dot) * R(Dot); }; 1141 if (Op == "/") { 1142 return [=](uint64_t Dot) -> uint64_t { 1143 uint64_t RHS = R(Dot); 1144 if (RHS == 0) { 1145 error("division by zero"); 1146 return 0; 1147 } 1148 return L(Dot) / RHS; 1149 }; 1150 } 1151 if (Op == "+") 1152 return [=](uint64_t Dot) { return L(Dot) + R(Dot); }; 1153 if (Op == "-") 1154 return [=](uint64_t Dot) { return L(Dot) - R(Dot); }; 1155 if (Op == "<") 1156 return [=](uint64_t Dot) { return L(Dot) < R(Dot); }; 1157 if (Op == ">") 1158 return [=](uint64_t Dot) { return L(Dot) > R(Dot); }; 1159 if (Op == ">=") 1160 return [=](uint64_t Dot) { return L(Dot) >= R(Dot); }; 1161 if (Op == "<=") 1162 return [=](uint64_t Dot) { return L(Dot) <= R(Dot); }; 1163 if (Op == "==") 1164 return [=](uint64_t Dot) { return L(Dot) == R(Dot); }; 1165 if (Op == "!=") 1166 return [=](uint64_t Dot) { return L(Dot) != R(Dot); }; 1167 if (Op == "&") 1168 return [=](uint64_t Dot) { return L(Dot) & R(Dot); }; 1169 if (Op == "|") 1170 return [=](uint64_t Dot) { return L(Dot) | R(Dot); }; 1171 llvm_unreachable("invalid operator"); 1172 } 1173 1174 // This is a part of the operator-precedence parser. This function 1175 // assumes that the remaining token stream starts with an operator. 1176 Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { 1177 while (!atEOF() && !Error) { 1178 // Read an operator and an expression. 1179 StringRef Op1 = peek(); 1180 if (Op1 == "?") 1181 return readTernary(Lhs); 1182 if (precedence(Op1) < MinPrec) 1183 break; 1184 next(); 1185 Expr Rhs = readPrimary(); 1186 1187 // Evaluate the remaining part of the expression first if the 1188 // next operator has greater precedence than the previous one. 1189 // For example, if we have read "+" and "3", and if the next 1190 // operator is "*", then we'll evaluate 3 * ... part first. 1191 while (!atEOF()) { 1192 StringRef Op2 = peek(); 1193 if (precedence(Op2) <= precedence(Op1)) 1194 break; 1195 Rhs = readExpr1(Rhs, precedence(Op2)); 1196 } 1197 1198 Lhs = combine(Op1, Lhs, Rhs); 1199 } 1200 return Lhs; 1201 } 1202 1203 uint64_t static getConstant(StringRef S) { 1204 if (S == "COMMONPAGESIZE") 1205 return Target->PageSize; 1206 if (S == "MAXPAGESIZE") 1207 return Target->MaxPageSize; 1208 error("unknown constant: " + S); 1209 return 0; 1210 } 1211 1212 // Parses Tok as an integer. Returns true if successful. 1213 // It recognizes hexadecimal (prefixed with "0x" or suffixed with "H") 1214 // and decimal numbers. Decimal numbers may have "K" (kilo) or 1215 // "M" (mega) prefixes. 1216 static bool readInteger(StringRef Tok, uint64_t &Result) { 1217 if (Tok.startswith("-")) { 1218 if (!readInteger(Tok.substr(1), Result)) 1219 return false; 1220 Result = -Result; 1221 return true; 1222 } 1223 if (Tok.startswith_lower("0x")) 1224 return !Tok.substr(2).getAsInteger(16, Result); 1225 if (Tok.endswith_lower("H")) 1226 return !Tok.drop_back().getAsInteger(16, Result); 1227 1228 int Suffix = 1; 1229 if (Tok.endswith_lower("K")) { 1230 Suffix = 1024; 1231 Tok = Tok.drop_back(); 1232 } else if (Tok.endswith_lower("M")) { 1233 Suffix = 1024 * 1024; 1234 Tok = Tok.drop_back(); 1235 } 1236 if (Tok.getAsInteger(10, Result)) 1237 return false; 1238 Result *= Suffix; 1239 return true; 1240 } 1241 1242 Expr ScriptParser::readPrimary() { 1243 if (peek() == "(") 1244 return readParenExpr(); 1245 1246 StringRef Tok = next(); 1247 1248 if (Tok == "~") { 1249 Expr E = readPrimary(); 1250 return [=](uint64_t Dot) { return ~E(Dot); }; 1251 } 1252 if (Tok == "-") { 1253 Expr E = readPrimary(); 1254 return [=](uint64_t Dot) { return -E(Dot); }; 1255 } 1256 1257 // Built-in functions are parsed here. 1258 // https://sourceware.org/binutils/docs/ld/Builtin-Functions.html. 1259 if (Tok == "ADDR") { 1260 expect("("); 1261 StringRef Name = next(); 1262 expect(")"); 1263 return 1264 [=](uint64_t Dot) { return ScriptBase->getOutputSectionAddress(Name); }; 1265 } 1266 if (Tok == "ASSERT") 1267 return readAssert(); 1268 if (Tok == "ALIGN") { 1269 Expr E = readParenExpr(); 1270 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1271 } 1272 if (Tok == "CONSTANT") { 1273 expect("("); 1274 StringRef Tok = next(); 1275 expect(")"); 1276 return [=](uint64_t Dot) { return getConstant(Tok); }; 1277 } 1278 if (Tok == "SEGMENT_START") { 1279 expect("("); 1280 next(); 1281 expect(","); 1282 uint64_t Val; 1283 next().getAsInteger(0, Val); 1284 expect(")"); 1285 return [=](uint64_t Dot) { return Val; }; 1286 } 1287 if (Tok == "DATA_SEGMENT_ALIGN") { 1288 expect("("); 1289 Expr E = readExpr(); 1290 expect(","); 1291 readExpr(); 1292 expect(")"); 1293 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1294 } 1295 if (Tok == "DATA_SEGMENT_END") { 1296 expect("("); 1297 expect("."); 1298 expect(")"); 1299 return [](uint64_t Dot) { return Dot; }; 1300 } 1301 // GNU linkers implements more complicated logic to handle 1302 // DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to 1303 // the next page boundary for simplicity. 1304 if (Tok == "DATA_SEGMENT_RELRO_END") { 1305 expect("("); 1306 next(); 1307 expect(","); 1308 readExpr(); 1309 expect(")"); 1310 return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); }; 1311 } 1312 if (Tok == "SIZEOF") { 1313 expect("("); 1314 StringRef Name = next(); 1315 expect(")"); 1316 return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); }; 1317 } 1318 if (Tok == "ALIGNOF") { 1319 expect("("); 1320 StringRef Name = next(); 1321 expect(")"); 1322 return 1323 [=](uint64_t Dot) { return ScriptBase->getOutputSectionAlign(Name); }; 1324 } 1325 if (Tok == "SIZEOF_HEADERS") 1326 return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); }; 1327 1328 // Tok is a literal number. 1329 uint64_t V; 1330 if (readInteger(Tok, V)) 1331 return [=](uint64_t Dot) { return V; }; 1332 1333 // Tok is a symbol name. 1334 if (Tok != "." && !isValidCIdentifier(Tok)) 1335 setError("malformed number: " + Tok); 1336 return [=](uint64_t Dot) { return getSymbolValue(Tok, Dot); }; 1337 } 1338 1339 Expr ScriptParser::readTernary(Expr Cond) { 1340 next(); 1341 Expr L = readExpr(); 1342 expect(":"); 1343 Expr R = readExpr(); 1344 return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); }; 1345 } 1346 1347 Expr ScriptParser::readParenExpr() { 1348 expect("("); 1349 Expr E = readExpr(); 1350 expect(")"); 1351 return E; 1352 } 1353 1354 std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() { 1355 std::vector<StringRef> Phdrs; 1356 while (!Error && peek().startswith(":")) { 1357 StringRef Tok = next(); 1358 Tok = (Tok.size() == 1) ? next() : Tok.substr(1); 1359 if (Tok.empty()) { 1360 setError("section header name is empty"); 1361 break; 1362 } 1363 Phdrs.push_back(Tok); 1364 } 1365 return Phdrs; 1366 } 1367 1368 unsigned ScriptParser::readPhdrType() { 1369 StringRef Tok = next(); 1370 unsigned Ret = StringSwitch<unsigned>(Tok) 1371 .Case("PT_NULL", PT_NULL) 1372 .Case("PT_LOAD", PT_LOAD) 1373 .Case("PT_DYNAMIC", PT_DYNAMIC) 1374 .Case("PT_INTERP", PT_INTERP) 1375 .Case("PT_NOTE", PT_NOTE) 1376 .Case("PT_SHLIB", PT_SHLIB) 1377 .Case("PT_PHDR", PT_PHDR) 1378 .Case("PT_TLS", PT_TLS) 1379 .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME) 1380 .Case("PT_GNU_STACK", PT_GNU_STACK) 1381 .Case("PT_GNU_RELRO", PT_GNU_RELRO) 1382 .Default(-1); 1383 1384 if (Ret == (unsigned)-1) { 1385 setError("invalid program header type: " + Tok); 1386 return PT_NULL; 1387 } 1388 return Ret; 1389 } 1390 1391 void ScriptParser::readVersionDeclaration(StringRef VerStr) { 1392 // Identifiers start at 2 because 0 and 1 are reserved 1393 // for VER_NDX_LOCAL and VER_NDX_GLOBAL constants. 1394 size_t VersionId = Config->VersionDefinitions.size() + 2; 1395 Config->VersionDefinitions.push_back({VerStr, VersionId}); 1396 1397 if (skip("global:") || peek() != "local:") 1398 readGlobal(VerStr); 1399 if (skip("local:")) 1400 readLocal(); 1401 expect("}"); 1402 1403 // Each version may have a parent version. For example, "Ver2" defined as 1404 // "Ver2 { global: foo; local: *; } Ver1;" has "Ver1" as a parent. This 1405 // version hierarchy is, probably against your instinct, purely for human; the 1406 // runtime doesn't care about them at all. In LLD, we simply skip the token. 1407 if (!VerStr.empty() && peek() != ";") 1408 next(); 1409 expect(";"); 1410 } 1411 1412 void ScriptParser::readLocal() { 1413 Config->DefaultSymbolVersion = VER_NDX_LOCAL; 1414 expect("*"); 1415 expect(";"); 1416 } 1417 1418 void ScriptParser::readExtern(std::vector<SymbolVersion> *Globals) { 1419 expect("C++"); 1420 expect("{"); 1421 1422 for (;;) { 1423 if (peek() == "}" || Error) 1424 break; 1425 Globals->push_back({next(), true}); 1426 expect(";"); 1427 } 1428 1429 expect("}"); 1430 expect(";"); 1431 } 1432 1433 void ScriptParser::readGlobal(StringRef VerStr) { 1434 std::vector<SymbolVersion> *Globals; 1435 if (VerStr.empty()) 1436 Globals = &Config->VersionScriptGlobals; 1437 else 1438 Globals = &Config->VersionDefinitions.back().Globals; 1439 1440 for (;;) { 1441 if (skip("extern")) 1442 readExtern(Globals); 1443 1444 StringRef Cur = peek(); 1445 if (Cur == "}" || Cur == "local:" || Error) 1446 return; 1447 next(); 1448 Globals->push_back({Cur, false}); 1449 expect(";"); 1450 } 1451 } 1452 1453 static bool isUnderSysroot(StringRef Path) { 1454 if (Config->Sysroot == "") 1455 return false; 1456 for (; !Path.empty(); Path = sys::path::parent_path(Path)) 1457 if (sys::fs::equivalent(Config->Sysroot, Path)) 1458 return true; 1459 return false; 1460 } 1461 1462 void elf::readLinkerScript(MemoryBufferRef MB) { 1463 StringRef Path = MB.getBufferIdentifier(); 1464 ScriptParser(MB.getBuffer(), isUnderSysroot(Path)).readLinkerScript(); 1465 } 1466 1467 void elf::readVersionScript(MemoryBufferRef MB) { 1468 ScriptParser(MB.getBuffer(), false).readVersionScript(); 1469 } 1470 1471 template class elf::LinkerScript<ELF32LE>; 1472 template class elf::LinkerScript<ELF32BE>; 1473 template class elf::LinkerScript<ELF64LE>; 1474 template class elf::LinkerScript<ELF64BE>; 1475