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 // 12 //===----------------------------------------------------------------------===// 13 14 #include "LinkerScript.h" 15 #include "Config.h" 16 #include "Driver.h" 17 #include "InputSection.h" 18 #include "Memory.h" 19 #include "OutputSections.h" 20 #include "ScriptParser.h" 21 #include "Strings.h" 22 #include "SymbolTable.h" 23 #include "Symbols.h" 24 #include "SyntheticSections.h" 25 #include "Target.h" 26 #include "Writer.h" 27 #include "llvm/ADT/STLExtras.h" 28 #include "llvm/ADT/SmallString.h" 29 #include "llvm/ADT/StringRef.h" 30 #include "llvm/ADT/StringSwitch.h" 31 #include "llvm/Support/Casting.h" 32 #include "llvm/Support/ELF.h" 33 #include "llvm/Support/Endian.h" 34 #include "llvm/Support/ErrorHandling.h" 35 #include "llvm/Support/FileSystem.h" 36 #include "llvm/Support/MathExtras.h" 37 #include "llvm/Support/Path.h" 38 #include <algorithm> 39 #include <cassert> 40 #include <cstddef> 41 #include <cstdint> 42 #include <iterator> 43 #include <limits> 44 #include <memory> 45 #include <string> 46 #include <tuple> 47 #include <vector> 48 49 using namespace llvm; 50 using namespace llvm::ELF; 51 using namespace llvm::object; 52 using namespace llvm::support::endian; 53 using namespace lld; 54 using namespace lld::elf; 55 56 LinkerScriptBase *elf::ScriptBase; 57 ScriptConfiguration *elf::ScriptConfig; 58 59 template <class ELFT> static SymbolBody *addRegular(SymbolAssignment *Cmd) { 60 uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; 61 Symbol *Sym = Symtab<ELFT>::X->addUndefined( 62 Cmd->Name, /*IsLocal=*/false, STB_GLOBAL, Visibility, 63 /*Type*/ 0, 64 /*CanOmitFromDynSym*/ false, /*File*/ nullptr); 65 66 replaceBody<DefinedRegular<ELFT>>(Sym, Cmd->Name, /*IsLocal=*/false, 67 Visibility, STT_NOTYPE, 0, 0, nullptr, 68 nullptr); 69 return Sym->body(); 70 } 71 72 template <class ELFT> static SymbolBody *addSynthetic(SymbolAssignment *Cmd) { 73 uint8_t Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT; 74 const OutputSectionBase *Sec = 75 ScriptConfig->HasSections ? nullptr : Cmd->Expression.Section(); 76 Symbol *Sym = Symtab<ELFT>::X->addUndefined( 77 Cmd->Name, /*IsLocal=*/false, STB_GLOBAL, Visibility, 78 /*Type*/ 0, 79 /*CanOmitFromDynSym*/ false, /*File*/ nullptr); 80 81 replaceBody<DefinedSynthetic>(Sym, Cmd->Name, 0, Sec); 82 return Sym->body(); 83 } 84 85 static bool isUnderSysroot(StringRef Path) { 86 if (Config->Sysroot == "") 87 return false; 88 for (; !Path.empty(); Path = sys::path::parent_path(Path)) 89 if (sys::fs::equivalent(Config->Sysroot, Path)) 90 return true; 91 return false; 92 } 93 94 template <class ELFT> static void assignSymbol(SymbolAssignment *Cmd) { 95 // If there are sections, then let the value be assigned later in 96 // `assignAddresses`. 97 if (ScriptConfig->HasSections) 98 return; 99 100 uint64_t Value = Cmd->Expression(0); 101 if (Cmd->Expression.IsAbsolute()) { 102 cast<DefinedRegular<ELFT>>(Cmd->Sym)->Value = Value; 103 } else { 104 const OutputSectionBase *Sec = Cmd->Expression.Section(); 105 if (Sec) 106 cast<DefinedSynthetic>(Cmd->Sym)->Value = Value - Sec->Addr; 107 } 108 } 109 110 template <class ELFT> static void addSymbol(SymbolAssignment *Cmd) { 111 if (Cmd->Name == ".") 112 return; 113 114 // If a symbol was in PROVIDE(), we need to define it only when 115 // it is a referenced undefined symbol. 116 SymbolBody *B = Symtab<ELFT>::X->find(Cmd->Name); 117 if (Cmd->Provide && (!B || B->isDefined())) 118 return; 119 120 // Otherwise, create a new symbol if one does not exist or an 121 // undefined one does exist. 122 if (Cmd->Expression.IsAbsolute()) 123 Cmd->Sym = addRegular<ELFT>(Cmd); 124 else 125 Cmd->Sym = addSynthetic<ELFT>(Cmd); 126 assignSymbol<ELFT>(Cmd); 127 } 128 129 bool SymbolAssignment::classof(const BaseCommand *C) { 130 return C->Kind == AssignmentKind; 131 } 132 133 bool OutputSectionCommand::classof(const BaseCommand *C) { 134 return C->Kind == OutputSectionKind; 135 } 136 137 bool InputSectionDescription::classof(const BaseCommand *C) { 138 return C->Kind == InputSectionKind; 139 } 140 141 bool AssertCommand::classof(const BaseCommand *C) { 142 return C->Kind == AssertKind; 143 } 144 145 bool BytesDataCommand::classof(const BaseCommand *C) { 146 return C->Kind == BytesDataKind; 147 } 148 149 template <class ELFT> LinkerScript<ELFT>::LinkerScript() = default; 150 template <class ELFT> LinkerScript<ELFT>::~LinkerScript() = default; 151 152 template <class ELFT> static StringRef basename(InputSectionBase<ELFT> *S) { 153 if (S->getFile()) 154 return sys::path::filename(S->getFile()->getName()); 155 return ""; 156 } 157 158 template <class ELFT> 159 bool LinkerScript<ELFT>::shouldKeep(InputSectionBase<ELFT> *S) { 160 for (InputSectionDescription *ID : Opt.KeptSections) 161 if (ID->FilePat.match(basename(S))) 162 for (SectionPattern &P : ID->SectionPatterns) 163 if (P.SectionPat.match(S->Name)) 164 return true; 165 return false; 166 } 167 168 static bool comparePriority(InputSectionData *A, InputSectionData *B) { 169 return getPriority(A->Name) < getPriority(B->Name); 170 } 171 172 static bool compareName(InputSectionData *A, InputSectionData *B) { 173 return A->Name < B->Name; 174 } 175 176 static bool compareAlignment(InputSectionData *A, InputSectionData *B) { 177 // ">" is not a mistake. Larger alignments are placed before smaller 178 // alignments in order to reduce the amount of padding necessary. 179 // This is compatible with GNU. 180 return A->Alignment > B->Alignment; 181 } 182 183 static std::function<bool(InputSectionData *, InputSectionData *)> 184 getComparator(SortSectionPolicy K) { 185 switch (K) { 186 case SortSectionPolicy::Alignment: 187 return compareAlignment; 188 case SortSectionPolicy::Name: 189 return compareName; 190 case SortSectionPolicy::Priority: 191 return comparePriority; 192 default: 193 llvm_unreachable("unknown sort policy"); 194 } 195 } 196 197 template <class ELFT> 198 static bool matchConstraints(ArrayRef<InputSectionBase<ELFT> *> Sections, 199 ConstraintKind Kind) { 200 if (Kind == ConstraintKind::NoConstraint) 201 return true; 202 bool IsRW = llvm::any_of(Sections, [=](InputSectionData *Sec2) { 203 auto *Sec = static_cast<InputSectionBase<ELFT> *>(Sec2); 204 return Sec->Flags & SHF_WRITE; 205 }); 206 return (IsRW && Kind == ConstraintKind::ReadWrite) || 207 (!IsRW && Kind == ConstraintKind::ReadOnly); 208 } 209 210 static void sortSections(InputSectionData **Begin, InputSectionData **End, 211 SortSectionPolicy K) { 212 if (K != SortSectionPolicy::Default && K != SortSectionPolicy::None) 213 std::stable_sort(Begin, End, getComparator(K)); 214 } 215 216 // Compute and remember which sections the InputSectionDescription matches. 217 template <class ELFT> 218 void LinkerScript<ELFT>::computeInputSections(InputSectionDescription *I) { 219 // Collects all sections that satisfy constraints of I 220 // and attach them to I. 221 for (SectionPattern &Pat : I->SectionPatterns) { 222 size_t SizeBefore = I->Sections.size(); 223 224 for (InputSectionBase<ELFT> *S : Symtab<ELFT>::X->Sections) { 225 if (!S->Live || S->Assigned) 226 continue; 227 228 StringRef Filename = basename(S); 229 if (!I->FilePat.match(Filename) || Pat.ExcludedFilePat.match(Filename)) 230 continue; 231 if (!Pat.SectionPat.match(S->Name)) 232 continue; 233 I->Sections.push_back(S); 234 S->Assigned = true; 235 } 236 237 // Sort sections as instructed by SORT-family commands and --sort-section 238 // option. Because SORT-family commands can be nested at most two depth 239 // (e.g. SORT_BY_NAME(SORT_BY_ALIGNMENT(.text.*))) and because the command 240 // line option is respected even if a SORT command is given, the exact 241 // behavior we have here is a bit complicated. Here are the rules. 242 // 243 // 1. If two SORT commands are given, --sort-section is ignored. 244 // 2. If one SORT command is given, and if it is not SORT_NONE, 245 // --sort-section is handled as an inner SORT command. 246 // 3. If one SORT command is given, and if it is SORT_NONE, don't sort. 247 // 4. If no SORT command is given, sort according to --sort-section. 248 InputSectionData **Begin = I->Sections.data() + SizeBefore; 249 InputSectionData **End = I->Sections.data() + I->Sections.size(); 250 if (Pat.SortOuter != SortSectionPolicy::None) { 251 if (Pat.SortInner == SortSectionPolicy::Default) 252 sortSections(Begin, End, Config->SortSection); 253 else 254 sortSections(Begin, End, Pat.SortInner); 255 sortSections(Begin, End, Pat.SortOuter); 256 } 257 } 258 } 259 260 template <class ELFT> 261 void LinkerScript<ELFT>::discard(ArrayRef<InputSectionBase<ELFT> *> V) { 262 for (InputSectionBase<ELFT> *S : V) { 263 S->Live = false; 264 reportDiscarded(S); 265 } 266 } 267 268 template <class ELFT> 269 std::vector<InputSectionBase<ELFT> *> 270 LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) { 271 std::vector<InputSectionBase<ELFT> *> Ret; 272 273 for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) { 274 auto *Cmd = dyn_cast<InputSectionDescription>(Base.get()); 275 if (!Cmd) 276 continue; 277 computeInputSections(Cmd); 278 for (InputSectionData *S : Cmd->Sections) 279 Ret.push_back(static_cast<InputSectionBase<ELFT> *>(S)); 280 } 281 282 return Ret; 283 } 284 285 template <class ELFT> 286 void LinkerScript<ELFT>::addSection(OutputSectionFactory<ELFT> &Factory, 287 InputSectionBase<ELFT> *Sec, 288 StringRef Name) { 289 OutputSectionBase *OutSec; 290 bool IsNew; 291 std::tie(OutSec, IsNew) = Factory.create(Sec, Name); 292 if (IsNew) 293 OutputSections->push_back(OutSec); 294 OutSec->addSection(Sec); 295 } 296 297 template <class ELFT> 298 void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) { 299 for (unsigned I = 0; I < Opt.Commands.size(); ++I) { 300 auto Iter = Opt.Commands.begin() + I; 301 const std::unique_ptr<BaseCommand> &Base1 = *Iter; 302 303 // Handle symbol assignments outside of any output section. 304 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) { 305 addSymbol<ELFT>(Cmd); 306 continue; 307 } 308 309 if (auto *Cmd = dyn_cast<AssertCommand>(Base1.get())) { 310 // If we don't have SECTIONS then output sections have already been 311 // created by Writer<ELFT>. The LinkerScript<ELFT>::assignAddresses 312 // will not be called, so ASSERT should be evaluated now. 313 if (!Opt.HasSections) 314 Cmd->Expression(0); 315 continue; 316 } 317 318 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) { 319 std::vector<InputSectionBase<ELFT> *> V = createInputSectionList(*Cmd); 320 321 // The output section name `/DISCARD/' is special. 322 // Any input section assigned to it is discarded. 323 if (Cmd->Name == "/DISCARD/") { 324 discard(V); 325 continue; 326 } 327 328 // This is for ONLY_IF_RO and ONLY_IF_RW. An output section directive 329 // ".foo : ONLY_IF_R[OW] { ... }" is handled only if all member input 330 // sections satisfy a given constraint. If not, a directive is handled 331 // as if it wasn't present from the beginning. 332 // 333 // Because we'll iterate over Commands many more times, the easiest 334 // way to "make it as if it wasn't present" is to just remove it. 335 if (!matchConstraints<ELFT>(V, Cmd->Constraint)) { 336 for (InputSectionBase<ELFT> *S : V) 337 S->Assigned = false; 338 Opt.Commands.erase(Iter); 339 --I; 340 continue; 341 } 342 343 // A directive may contain symbol definitions like this: 344 // ".foo : { ...; bar = .; }". Handle them. 345 for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands) 346 if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) 347 addSymbol<ELFT>(OutCmd); 348 349 // Handle subalign (e.g. ".foo : SUBALIGN(32) { ... }"). If subalign 350 // is given, input sections are aligned to that value, whether the 351 // given value is larger or smaller than the original section alignment. 352 if (Cmd->SubalignExpr) { 353 uint32_t Subalign = Cmd->SubalignExpr(0); 354 for (InputSectionBase<ELFT> *S : V) 355 S->Alignment = Subalign; 356 } 357 358 // Add input sections to an output section. 359 for (InputSectionBase<ELFT> *S : V) 360 addSection(Factory, S, Cmd->Name); 361 } 362 } 363 } 364 365 // Add sections that didn't match any sections command. 366 template <class ELFT> 367 void LinkerScript<ELFT>::addOrphanSections( 368 OutputSectionFactory<ELFT> &Factory) { 369 for (InputSectionBase<ELFT> *S : Symtab<ELFT>::X->Sections) 370 if (S->Live && !S->OutSec) 371 addSection(Factory, S, getOutputSectionName(S->Name)); 372 } 373 374 // Sets value of a section-defined symbol. Two kinds of 375 // symbols are processed: synthetic symbols, whose value 376 // is an offset from beginning of section and regular 377 // symbols whose value is absolute. 378 template <class ELFT> 379 static void assignSectionSymbol(SymbolAssignment *Cmd, 380 typename ELFT::uint Value) { 381 if (!Cmd->Sym) 382 return; 383 384 if (auto *Body = dyn_cast<DefinedSynthetic>(Cmd->Sym)) { 385 Body->Section = Cmd->Expression.Section(); 386 Body->Value = Cmd->Expression(Value) - Body->Section->Addr; 387 return; 388 } 389 auto *Body = cast<DefinedRegular<ELFT>>(Cmd->Sym); 390 Body->Value = Cmd->Expression(Value); 391 } 392 393 template <class ELFT> static bool isTbss(OutputSectionBase *Sec) { 394 return (Sec->Flags & SHF_TLS) && Sec->Type == SHT_NOBITS; 395 } 396 397 template <class ELFT> void LinkerScript<ELFT>::output(InputSection<ELFT> *S) { 398 if (!AlreadyOutputIS.insert(S).second) 399 return; 400 bool IsTbss = isTbss<ELFT>(CurOutSec); 401 402 uintX_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot; 403 Pos = alignTo(Pos, S->Alignment); 404 S->OutSecOff = Pos - CurOutSec->Addr; 405 Pos += S->getSize(); 406 407 // Update output section size after adding each section. This is so that 408 // SIZEOF works correctly in the case below: 409 // .foo { *(.aaa) a = SIZEOF(.foo); *(.bbb) } 410 CurOutSec->Size = Pos - CurOutSec->Addr; 411 412 if (IsTbss) 413 ThreadBssOffset = Pos - Dot; 414 else 415 Dot = Pos; 416 } 417 418 template <class ELFT> void LinkerScript<ELFT>::flush() { 419 if (!CurOutSec || !AlreadyOutputOS.insert(CurOutSec).second) 420 return; 421 if (auto *OutSec = dyn_cast<OutputSection<ELFT>>(CurOutSec)) { 422 for (InputSection<ELFT> *I : OutSec->Sections) 423 output(I); 424 } else { 425 Dot += CurOutSec->Size; 426 } 427 } 428 429 template <class ELFT> 430 void LinkerScript<ELFT>::switchTo(OutputSectionBase *Sec) { 431 if (CurOutSec == Sec) 432 return; 433 if (AlreadyOutputOS.count(Sec)) 434 return; 435 436 flush(); 437 CurOutSec = Sec; 438 439 Dot = alignTo(Dot, CurOutSec->Addralign); 440 CurOutSec->Addr = isTbss<ELFT>(CurOutSec) ? Dot + ThreadBssOffset : Dot; 441 442 // If neither AT nor AT> is specified for an allocatable section, the linker 443 // will set the LMA such that the difference between VMA and LMA for the 444 // section is the same as the preceding output section in the same region 445 // https://sourceware.org/binutils/docs-2.20/ld/Output-Section-LMA.html 446 CurOutSec->setLMAOffset(LMAOffset); 447 } 448 449 template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) { 450 // This handles the assignments to symbol or to a location counter (.) 451 if (auto *AssignCmd = dyn_cast<SymbolAssignment>(&Base)) { 452 if (AssignCmd->Name == ".") { 453 // Update to location counter means update to section size. 454 uintX_t Val = AssignCmd->Expression(Dot); 455 if (Val < Dot) 456 error("unable to move location counter backward for: " + 457 CurOutSec->Name); 458 Dot = Val; 459 CurOutSec->Size = Dot - CurOutSec->Addr; 460 return; 461 } 462 assignSectionSymbol<ELFT>(AssignCmd, Dot); 463 return; 464 } 465 466 // Handle BYTE(), SHORT(), LONG(), or QUAD(). 467 if (auto *DataCmd = dyn_cast<BytesDataCommand>(&Base)) { 468 DataCmd->Offset = Dot - CurOutSec->Addr; 469 Dot += DataCmd->Size; 470 CurOutSec->Size = Dot - CurOutSec->Addr; 471 return; 472 } 473 474 if (auto *AssertCmd = dyn_cast<AssertCommand>(&Base)) { 475 AssertCmd->Expression(Dot); 476 return; 477 } 478 479 // It handles single input section description command, 480 // calculates and assigns the offsets for each section and also 481 // updates the output section size. 482 auto &ICmd = cast<InputSectionDescription>(Base); 483 for (InputSectionData *ID : ICmd.Sections) { 484 // We tentatively added all synthetic sections at the beginning and removed 485 // empty ones afterwards (because there is no way to know whether they were 486 // going be empty or not other than actually running linker scripts.) 487 // We need to ignore remains of empty sections. 488 if (auto *Sec = dyn_cast<SyntheticSection<ELFT>>(ID)) 489 if (Sec->empty()) 490 continue; 491 492 auto *IB = static_cast<InputSectionBase<ELFT> *>(ID); 493 switchTo(IB->OutSec); 494 if (auto *I = dyn_cast<InputSection<ELFT>>(IB)) 495 output(I); 496 else 497 flush(); 498 } 499 } 500 501 template <class ELFT> 502 static std::vector<OutputSectionBase *> 503 findSections(StringRef Name, const std::vector<OutputSectionBase *> &Sections) { 504 std::vector<OutputSectionBase *> Ret; 505 for (OutputSectionBase *Sec : Sections) 506 if (Sec->getName() == Name) 507 Ret.push_back(Sec); 508 return Ret; 509 } 510 511 // This function assigns offsets to input sections and an output section 512 // for a single sections command (e.g. ".text { *(.text); }"). 513 template <class ELFT> 514 void LinkerScript<ELFT>::assignOffsets(OutputSectionCommand *Cmd) { 515 if (Cmd->LMAExpr) 516 LMAOffset = Cmd->LMAExpr(Dot) - Dot; 517 std::vector<OutputSectionBase *> Sections = 518 findSections<ELFT>(Cmd->Name, *OutputSections); 519 if (Sections.empty()) 520 return; 521 switchTo(Sections[0]); 522 523 // Find the last section output location. We will output orphan sections 524 // there so that end symbols point to the correct location. 525 auto E = std::find_if(Cmd->Commands.rbegin(), Cmd->Commands.rend(), 526 [](const std::unique_ptr<BaseCommand> &Cmd) { 527 return !isa<SymbolAssignment>(*Cmd); 528 }) 529 .base(); 530 for (auto I = Cmd->Commands.begin(); I != E; ++I) 531 process(**I); 532 for (OutputSectionBase *Base : Sections) 533 switchTo(Base); 534 flush(); 535 std::for_each(E, Cmd->Commands.end(), 536 [this](std::unique_ptr<BaseCommand> &B) { process(*B.get()); }); 537 } 538 539 template <class ELFT> void LinkerScript<ELFT>::removeEmptyCommands() { 540 // It is common practice to use very generic linker scripts. So for any 541 // given run some of the output sections in the script will be empty. 542 // We could create corresponding empty output sections, but that would 543 // clutter the output. 544 // We instead remove trivially empty sections. The bfd linker seems even 545 // more aggressive at removing them. 546 auto Pos = std::remove_if( 547 Opt.Commands.begin(), Opt.Commands.end(), 548 [&](const std::unique_ptr<BaseCommand> &Base) { 549 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 550 return findSections<ELFT>(Cmd->Name, *OutputSections).empty(); 551 return false; 552 }); 553 Opt.Commands.erase(Pos, Opt.Commands.end()); 554 } 555 556 static bool isAllSectionDescription(const OutputSectionCommand &Cmd) { 557 for (const std::unique_ptr<BaseCommand> &I : Cmd.Commands) 558 if (!isa<InputSectionDescription>(*I)) 559 return false; 560 return true; 561 } 562 563 template <class ELFT> void LinkerScript<ELFT>::adjustSectionsBeforeSorting() { 564 // If the output section contains only symbol assignments, create a 565 // corresponding output section. The bfd linker seems to only create them if 566 // '.' is assigned to, but creating these section should not have any bad 567 // consequeces and gives us a section to put the symbol in. 568 uintX_t Flags = SHF_ALLOC; 569 uint32_t Type = SHT_NOBITS; 570 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 571 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 572 if (!Cmd) 573 continue; 574 std::vector<OutputSectionBase *> Secs = 575 findSections<ELFT>(Cmd->Name, *OutputSections); 576 if (!Secs.empty()) { 577 Flags = Secs[0]->Flags; 578 Type = Secs[0]->Type; 579 continue; 580 } 581 582 if (isAllSectionDescription(*Cmd)) 583 continue; 584 585 auto *OutSec = make<OutputSection<ELFT>>(Cmd->Name, Type, Flags); 586 OutputSections->push_back(OutSec); 587 } 588 } 589 590 template <class ELFT> void LinkerScript<ELFT>::adjustSectionsAfterSorting() { 591 placeOrphanSections(); 592 593 // If output section command doesn't specify any segments, 594 // and we haven't previously assigned any section to segment, 595 // then we simply assign section to the very first load segment. 596 // Below is an example of such linker script: 597 // PHDRS { seg PT_LOAD; } 598 // SECTIONS { .aaa : { *(.aaa) } } 599 std::vector<StringRef> DefPhdrs; 600 auto FirstPtLoad = 601 std::find_if(Opt.PhdrsCommands.begin(), Opt.PhdrsCommands.end(), 602 [](const PhdrsCommand &Cmd) { return Cmd.Type == PT_LOAD; }); 603 if (FirstPtLoad != Opt.PhdrsCommands.end()) 604 DefPhdrs.push_back(FirstPtLoad->Name); 605 606 // Walk the commands and propagate the program headers to commands that don't 607 // explicitly specify them. 608 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 609 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 610 if (!Cmd) 611 continue; 612 if (Cmd->Phdrs.empty()) 613 Cmd->Phdrs = DefPhdrs; 614 else 615 DefPhdrs = Cmd->Phdrs; 616 } 617 618 removeEmptyCommands(); 619 } 620 621 // When placing orphan sections, we want to place them after symbol assignments 622 // so that an orphan after 623 // begin_foo = .; 624 // foo : { *(foo) } 625 // end_foo = .; 626 // doesn't break the intended meaning of the begin/end symbols. 627 // We don't want to go over sections since Writer<ELFT>::sortSections is the 628 // one in charge of deciding the order of the sections. 629 // We don't want to go over alignments, since doing so in 630 // rx_sec : { *(rx_sec) } 631 // . = ALIGN(0x1000); 632 // /* The RW PT_LOAD starts here*/ 633 // rw_sec : { *(rw_sec) } 634 // would mean that the RW PT_LOAD would become unaligned. 635 static bool shouldSkip(const BaseCommand &Cmd) { 636 if (isa<OutputSectionCommand>(Cmd)) 637 return false; 638 const auto *Assign = dyn_cast<SymbolAssignment>(&Cmd); 639 if (!Assign) 640 return true; 641 return Assign->Name != "."; 642 } 643 644 // Orphan sections are sections present in the input files which are not 645 // explicitly placed into the output file by the linker script. This just 646 // places them in the order already decided in OutputSections. 647 template <class ELFT> void LinkerScript<ELFT>::placeOrphanSections() { 648 // The OutputSections are already in the correct order. 649 // This loops creates or moves commands as needed so that they are in the 650 // correct order. 651 int CmdIndex = 0; 652 653 // As a horrible special case, skip the first . assignment if it is before any 654 // section. We do this because it is common to set a load address by starting 655 // the script with ". = 0xabcd" and the expectation is that every section is 656 // after that. 657 auto FirstSectionOrDotAssignment = 658 std::find_if(Opt.Commands.begin(), Opt.Commands.end(), 659 [](const std::unique_ptr<BaseCommand> &Cmd) { 660 if (isa<OutputSectionCommand>(*Cmd)) 661 return true; 662 const auto *Assign = dyn_cast<SymbolAssignment>(Cmd.get()); 663 if (!Assign) 664 return false; 665 return Assign->Name == "."; 666 }); 667 if (FirstSectionOrDotAssignment != Opt.Commands.end()) { 668 CmdIndex = FirstSectionOrDotAssignment - Opt.Commands.begin(); 669 if (isa<SymbolAssignment>(**FirstSectionOrDotAssignment)) 670 ++CmdIndex; 671 } 672 673 for (OutputSectionBase *Sec : *OutputSections) { 674 StringRef Name = Sec->getName(); 675 676 // Find the last spot where we can insert a command and still get the 677 // correct result. 678 auto CmdIter = Opt.Commands.begin() + CmdIndex; 679 auto E = Opt.Commands.end(); 680 while (CmdIter != E && shouldSkip(**CmdIter)) { 681 ++CmdIter; 682 ++CmdIndex; 683 } 684 685 auto Pos = 686 std::find_if(CmdIter, E, [&](const std::unique_ptr<BaseCommand> &Base) { 687 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 688 return Cmd && Cmd->Name == Name; 689 }); 690 if (Pos == E) { 691 Opt.Commands.insert(CmdIter, 692 llvm::make_unique<OutputSectionCommand>(Name)); 693 ++CmdIndex; 694 continue; 695 } 696 697 // Continue from where we found it. 698 CmdIndex = (Pos - Opt.Commands.begin()) + 1; 699 } 700 } 701 702 template <class ELFT> 703 void LinkerScript<ELFT>::assignAddresses(std::vector<PhdrEntry> &Phdrs) { 704 // Assign addresses as instructed by linker script SECTIONS sub-commands. 705 Dot = 0; 706 707 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 708 if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) { 709 if (Cmd->Name == ".") { 710 Dot = Cmd->Expression(Dot); 711 } else if (Cmd->Sym) { 712 assignSectionSymbol<ELFT>(Cmd, Dot); 713 } 714 continue; 715 } 716 717 if (auto *Cmd = dyn_cast<AssertCommand>(Base.get())) { 718 Cmd->Expression(Dot); 719 continue; 720 } 721 722 auto *Cmd = cast<OutputSectionCommand>(Base.get()); 723 if (Cmd->AddrExpr) 724 Dot = Cmd->AddrExpr(Dot); 725 assignOffsets(Cmd); 726 } 727 728 uintX_t MinVA = std::numeric_limits<uintX_t>::max(); 729 for (OutputSectionBase *Sec : *OutputSections) { 730 if (Sec->Flags & SHF_ALLOC) 731 MinVA = std::min<uint64_t>(MinVA, Sec->Addr); 732 else 733 Sec->Addr = 0; 734 } 735 736 uintX_t HeaderSize = getHeaderSize(); 737 // If the linker script doesn't have PHDRS, add ElfHeader and ProgramHeaders 738 // now that we know we have space. 739 if (HeaderSize <= MinVA && !hasPhdrsCommands()) 740 allocateHeaders<ELFT>(Phdrs, *OutputSections); 741 742 // ELF and Program headers need to be right before the first section in 743 // memory. Set their addresses accordingly. 744 MinVA = alignDown(MinVA - HeaderSize, Config->MaxPageSize); 745 Out<ELFT>::ElfHeader->Addr = MinVA; 746 Out<ELFT>::ProgramHeaders->Addr = Out<ELFT>::ElfHeader->Size + MinVA; 747 } 748 749 // Creates program headers as instructed by PHDRS linker script command. 750 template <class ELFT> std::vector<PhdrEntry> LinkerScript<ELFT>::createPhdrs() { 751 std::vector<PhdrEntry> Ret; 752 753 // Process PHDRS and FILEHDR keywords because they are not 754 // real output sections and cannot be added in the following loop. 755 for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) { 756 Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags); 757 PhdrEntry &Phdr = Ret.back(); 758 759 if (Cmd.HasFilehdr) 760 Phdr.add(Out<ELFT>::ElfHeader); 761 if (Cmd.HasPhdrs) 762 Phdr.add(Out<ELFT>::ProgramHeaders); 763 764 if (Cmd.LMAExpr) { 765 Phdr.p_paddr = Cmd.LMAExpr(0); 766 Phdr.HasLMA = true; 767 } 768 } 769 770 // Add output sections to program headers. 771 for (OutputSectionBase *Sec : *OutputSections) { 772 if (!(Sec->Flags & SHF_ALLOC)) 773 break; 774 775 // Assign headers specified by linker script 776 for (size_t Id : getPhdrIndices(Sec->getName())) { 777 Ret[Id].add(Sec); 778 if (Opt.PhdrsCommands[Id].Flags == UINT_MAX) 779 Ret[Id].p_flags |= Sec->getPhdrFlags(); 780 } 781 } 782 return Ret; 783 } 784 785 template <class ELFT> bool LinkerScript<ELFT>::ignoreInterpSection() { 786 // Ignore .interp section in case we have PHDRS specification 787 // and PT_INTERP isn't listed. 788 return !Opt.PhdrsCommands.empty() && 789 llvm::find_if(Opt.PhdrsCommands, [](const PhdrsCommand &Cmd) { 790 return Cmd.Type == PT_INTERP; 791 }) == Opt.PhdrsCommands.end(); 792 } 793 794 template <class ELFT> uint32_t LinkerScript<ELFT>::getFiller(StringRef Name) { 795 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 796 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 797 if (Cmd->Name == Name) 798 return Cmd->Filler; 799 return 0; 800 } 801 802 template <class ELFT> 803 static void writeInt(uint8_t *Buf, uint64_t Data, uint64_t Size) { 804 const endianness E = ELFT::TargetEndianness; 805 806 switch (Size) { 807 case 1: 808 *Buf = (uint8_t)Data; 809 break; 810 case 2: 811 write16<E>(Buf, Data); 812 break; 813 case 4: 814 write32<E>(Buf, Data); 815 break; 816 case 8: 817 write64<E>(Buf, Data); 818 break; 819 default: 820 llvm_unreachable("unsupported Size argument"); 821 } 822 } 823 824 template <class ELFT> 825 void LinkerScript<ELFT>::writeDataBytes(StringRef Name, uint8_t *Buf) { 826 int I = getSectionIndex(Name); 827 if (I == INT_MAX) 828 return; 829 830 auto *Cmd = dyn_cast<OutputSectionCommand>(Opt.Commands[I].get()); 831 for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands) 832 if (auto *Data = dyn_cast<BytesDataCommand>(Base.get())) 833 writeInt<ELFT>(Buf + Data->Offset, Data->Expression(0), Data->Size); 834 } 835 836 template <class ELFT> bool LinkerScript<ELFT>::hasLMA(StringRef Name) { 837 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) 838 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get())) 839 if (Cmd->LMAExpr && Cmd->Name == Name) 840 return true; 841 return false; 842 } 843 844 // Returns the index of the given section name in linker script 845 // SECTIONS commands. Sections are laid out as the same order as they 846 // were in the script. If a given name did not appear in the script, 847 // it returns INT_MAX, so that it will be laid out at end of file. 848 template <class ELFT> int LinkerScript<ELFT>::getSectionIndex(StringRef Name) { 849 for (int I = 0, E = Opt.Commands.size(); I != E; ++I) 850 if (auto *Cmd = dyn_cast<OutputSectionCommand>(Opt.Commands[I].get())) 851 if (Cmd->Name == Name) 852 return I; 853 return INT_MAX; 854 } 855 856 template <class ELFT> bool LinkerScript<ELFT>::hasPhdrsCommands() { 857 return !Opt.PhdrsCommands.empty(); 858 } 859 860 template <class ELFT> 861 const OutputSectionBase *LinkerScript<ELFT>::getOutputSection(const Twine &Loc, 862 StringRef Name) { 863 static OutputSectionBase FakeSec("", 0, 0); 864 865 for (OutputSectionBase *Sec : *OutputSections) 866 if (Sec->getName() == Name) 867 return Sec; 868 869 error(Loc + ": undefined section " + Name); 870 return &FakeSec; 871 } 872 873 // This function is essentially the same as getOutputSection(Name)->Size, 874 // but it won't print out an error message if a given section is not found. 875 // 876 // Linker script does not create an output section if its content is empty. 877 // We want to allow SIZEOF(.foo) where .foo is a section which happened to 878 // be empty. That is why this function is different from getOutputSection(). 879 template <class ELFT> 880 uint64_t LinkerScript<ELFT>::getOutputSectionSize(StringRef Name) { 881 for (OutputSectionBase *Sec : *OutputSections) 882 if (Sec->getName() == Name) 883 return Sec->Size; 884 return 0; 885 } 886 887 template <class ELFT> uint64_t LinkerScript<ELFT>::getHeaderSize() { 888 return elf::getHeaderSize<ELFT>(); 889 } 890 891 template <class ELFT> 892 uint64_t LinkerScript<ELFT>::getSymbolValue(const Twine &Loc, StringRef S) { 893 if (SymbolBody *B = Symtab<ELFT>::X->find(S)) 894 return B->getVA<ELFT>(); 895 error(Loc + ": symbol not found: " + S); 896 return 0; 897 } 898 899 template <class ELFT> bool LinkerScript<ELFT>::isDefined(StringRef S) { 900 return Symtab<ELFT>::X->find(S) != nullptr; 901 } 902 903 template <class ELFT> bool LinkerScript<ELFT>::isAbsolute(StringRef S) { 904 SymbolBody *Sym = Symtab<ELFT>::X->find(S); 905 auto *DR = dyn_cast_or_null<DefinedRegular<ELFT>>(Sym); 906 return DR && !DR->Section; 907 } 908 909 // Gets section symbol belongs to. Symbol "." doesn't belong to any 910 // specific section but isn't absolute at the same time, so we try 911 // to find suitable section for it as well. 912 template <class ELFT> 913 const OutputSectionBase *LinkerScript<ELFT>::getSymbolSection(StringRef S) { 914 SymbolBody *Sym = Symtab<ELFT>::X->find(S); 915 if (!Sym) { 916 if (OutputSections->empty()) 917 return nullptr; 918 return CurOutSec ? CurOutSec : (*OutputSections)[0]; 919 } 920 921 if (auto *DR = dyn_cast_or_null<DefinedRegular<ELFT>>(Sym)) 922 return DR->Section ? DR->Section->OutSec : nullptr; 923 if (auto *DS = dyn_cast_or_null<DefinedSynthetic>(Sym)) 924 return DS->Section; 925 926 return nullptr; 927 } 928 929 // Returns indices of ELF headers containing specific section, identified 930 // by Name. Each index is a zero based number of ELF header listed within 931 // PHDRS {} script block. 932 template <class ELFT> 933 std::vector<size_t> LinkerScript<ELFT>::getPhdrIndices(StringRef SectionName) { 934 for (const std::unique_ptr<BaseCommand> &Base : Opt.Commands) { 935 auto *Cmd = dyn_cast<OutputSectionCommand>(Base.get()); 936 if (!Cmd || Cmd->Name != SectionName) 937 continue; 938 939 std::vector<size_t> Ret; 940 for (StringRef PhdrName : Cmd->Phdrs) 941 Ret.push_back(getPhdrIndex(Cmd->Location, PhdrName)); 942 return Ret; 943 } 944 return {}; 945 } 946 947 template <class ELFT> 948 size_t LinkerScript<ELFT>::getPhdrIndex(const Twine &Loc, StringRef PhdrName) { 949 size_t I = 0; 950 for (PhdrsCommand &Cmd : Opt.PhdrsCommands) { 951 if (Cmd.Name == PhdrName) 952 return I; 953 ++I; 954 } 955 error(Loc + ": section header '" + PhdrName + "' is not listed in PHDRS"); 956 return 0; 957 } 958 959 class elf::ScriptParser final : public ScriptParserBase { 960 typedef void (ScriptParser::*Handler)(); 961 962 public: 963 ScriptParser(MemoryBufferRef MB) 964 : ScriptParserBase(MB), 965 IsUnderSysroot(isUnderSysroot(MB.getBufferIdentifier())) {} 966 967 void readLinkerScript(); 968 void readVersionScript(); 969 void readDynamicList(); 970 971 private: 972 void addFile(StringRef Path); 973 974 void readAsNeeded(); 975 void readEntry(); 976 void readExtern(); 977 void readGroup(); 978 void readInclude(); 979 void readOutput(); 980 void readOutputArch(); 981 void readOutputFormat(); 982 void readPhdrs(); 983 void readSearchDir(); 984 void readSections(); 985 void readVersion(); 986 void readVersionScriptCommand(); 987 988 SymbolAssignment *readAssignment(StringRef Name); 989 BytesDataCommand *readBytesDataCommand(StringRef Tok); 990 uint32_t readFill(); 991 OutputSectionCommand *readOutputSectionDescription(StringRef OutSec); 992 uint32_t readOutputSectionFiller(StringRef Tok); 993 std::vector<StringRef> readOutputSectionPhdrs(); 994 InputSectionDescription *readInputSectionDescription(StringRef Tok); 995 StringMatcher readFilePatterns(); 996 std::vector<SectionPattern> readInputSectionsList(); 997 InputSectionDescription *readInputSectionRules(StringRef FilePattern); 998 unsigned readPhdrType(); 999 SortSectionPolicy readSortKind(); 1000 SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); 1001 SymbolAssignment *readProvideOrAssignment(StringRef Tok); 1002 void readSort(); 1003 Expr readAssert(); 1004 1005 Expr readExpr(); 1006 Expr readExpr1(Expr Lhs, int MinPrec); 1007 StringRef readParenLiteral(); 1008 Expr readPrimary(); 1009 Expr readTernary(Expr Cond); 1010 Expr readParenExpr(); 1011 1012 // For parsing version script. 1013 std::vector<SymbolVersion> readVersionExtern(); 1014 void readAnonymousDeclaration(); 1015 void readVersionDeclaration(StringRef VerStr); 1016 std::vector<SymbolVersion> readSymbols(); 1017 1018 ScriptConfiguration &Opt = *ScriptConfig; 1019 bool IsUnderSysroot; 1020 }; 1021 1022 void ScriptParser::readDynamicList() { 1023 expect("{"); 1024 readAnonymousDeclaration(); 1025 if (!atEOF()) 1026 setError("EOF expected, but got " + next()); 1027 } 1028 1029 void ScriptParser::readVersionScript() { 1030 readVersionScriptCommand(); 1031 if (!atEOF()) 1032 setError("EOF expected, but got " + next()); 1033 } 1034 1035 void ScriptParser::readVersionScriptCommand() { 1036 if (consume("{")) { 1037 readAnonymousDeclaration(); 1038 return; 1039 } 1040 1041 while (!atEOF() && !Error && peek() != "}") { 1042 StringRef VerStr = next(); 1043 if (VerStr == "{") { 1044 setError("anonymous version definition is used in " 1045 "combination with other version definitions"); 1046 return; 1047 } 1048 expect("{"); 1049 readVersionDeclaration(VerStr); 1050 } 1051 } 1052 1053 void ScriptParser::readVersion() { 1054 expect("{"); 1055 readVersionScriptCommand(); 1056 expect("}"); 1057 } 1058 1059 void ScriptParser::readLinkerScript() { 1060 while (!atEOF()) { 1061 StringRef Tok = next(); 1062 if (Tok == ";") 1063 continue; 1064 1065 if (Tok == "ASSERT") { 1066 Opt.Commands.emplace_back(new AssertCommand(readAssert())); 1067 } else if (Tok == "ENTRY") { 1068 readEntry(); 1069 } else if (Tok == "EXTERN") { 1070 readExtern(); 1071 } else if (Tok == "GROUP" || Tok == "INPUT") { 1072 readGroup(); 1073 } else if (Tok == "INCLUDE") { 1074 readInclude(); 1075 } else if (Tok == "OUTPUT") { 1076 readOutput(); 1077 } else if (Tok == "OUTPUT_ARCH") { 1078 readOutputArch(); 1079 } else if (Tok == "OUTPUT_FORMAT") { 1080 readOutputFormat(); 1081 } else if (Tok == "PHDRS") { 1082 readPhdrs(); 1083 } else if (Tok == "SEARCH_DIR") { 1084 readSearchDir(); 1085 } else if (Tok == "SECTIONS") { 1086 readSections(); 1087 } else if (Tok == "VERSION") { 1088 readVersion(); 1089 } else if (SymbolAssignment *Cmd = readProvideOrAssignment(Tok)) { 1090 Opt.Commands.emplace_back(Cmd); 1091 } else { 1092 setError("unknown directive: " + Tok); 1093 } 1094 } 1095 } 1096 1097 void ScriptParser::addFile(StringRef S) { 1098 if (IsUnderSysroot && S.startswith("/")) { 1099 SmallString<128> PathData; 1100 StringRef Path = (Config->Sysroot + S).toStringRef(PathData); 1101 if (sys::fs::exists(Path)) { 1102 Driver->addFile(Saver.save(Path)); 1103 return; 1104 } 1105 } 1106 1107 if (sys::path::is_absolute(S)) { 1108 Driver->addFile(S); 1109 } else if (S.startswith("=")) { 1110 if (Config->Sysroot.empty()) 1111 Driver->addFile(S.substr(1)); 1112 else 1113 Driver->addFile(Saver.save(Config->Sysroot + "/" + S.substr(1))); 1114 } else if (S.startswith("-l")) { 1115 Driver->addLibrary(S.substr(2)); 1116 } else if (sys::fs::exists(S)) { 1117 Driver->addFile(S); 1118 } else { 1119 if (Optional<std::string> Path = findFromSearchPaths(S)) 1120 Driver->addFile(Saver.save(*Path)); 1121 else 1122 setError("unable to find " + S); 1123 } 1124 } 1125 1126 void ScriptParser::readAsNeeded() { 1127 expect("("); 1128 bool Orig = Config->AsNeeded; 1129 Config->AsNeeded = true; 1130 while (!Error && !consume(")")) 1131 addFile(unquote(next())); 1132 Config->AsNeeded = Orig; 1133 } 1134 1135 void ScriptParser::readEntry() { 1136 // -e <symbol> takes predecence over ENTRY(<symbol>). 1137 expect("("); 1138 StringRef Tok = next(); 1139 if (Config->Entry.empty()) 1140 Config->Entry = Tok; 1141 expect(")"); 1142 } 1143 1144 void ScriptParser::readExtern() { 1145 expect("("); 1146 while (!Error && !consume(")")) 1147 Config->Undefined.push_back(next()); 1148 } 1149 1150 void ScriptParser::readGroup() { 1151 expect("("); 1152 while (!Error && !consume(")")) { 1153 StringRef Tok = next(); 1154 if (Tok == "AS_NEEDED") 1155 readAsNeeded(); 1156 else 1157 addFile(unquote(Tok)); 1158 } 1159 } 1160 1161 void ScriptParser::readInclude() { 1162 StringRef Tok = unquote(next()); 1163 1164 // https://sourceware.org/binutils/docs/ld/File-Commands.html: 1165 // The file will be searched for in the current directory, and in any 1166 // directory specified with the -L option. 1167 if (sys::fs::exists(Tok)) { 1168 if (Optional<MemoryBufferRef> MB = readFile(Tok)) 1169 tokenize(*MB); 1170 return; 1171 } 1172 if (Optional<std::string> Path = findFromSearchPaths(Tok)) { 1173 if (Optional<MemoryBufferRef> MB = readFile(*Path)) 1174 tokenize(*MB); 1175 return; 1176 } 1177 setError("cannot open " + Tok); 1178 } 1179 1180 void ScriptParser::readOutput() { 1181 // -o <file> takes predecence over OUTPUT(<file>). 1182 expect("("); 1183 StringRef Tok = next(); 1184 if (Config->OutputFile.empty()) 1185 Config->OutputFile = unquote(Tok); 1186 expect(")"); 1187 } 1188 1189 void ScriptParser::readOutputArch() { 1190 // Error checking only for now. 1191 expect("("); 1192 skip(); 1193 expect(")"); 1194 } 1195 1196 void ScriptParser::readOutputFormat() { 1197 // Error checking only for now. 1198 expect("("); 1199 skip(); 1200 StringRef Tok = next(); 1201 if (Tok == ")") 1202 return; 1203 if (Tok != ",") { 1204 setError("unexpected token: " + Tok); 1205 return; 1206 } 1207 skip(); 1208 expect(","); 1209 skip(); 1210 expect(")"); 1211 } 1212 1213 void ScriptParser::readPhdrs() { 1214 expect("{"); 1215 while (!Error && !consume("}")) { 1216 StringRef Tok = next(); 1217 Opt.PhdrsCommands.push_back( 1218 {Tok, PT_NULL, false, false, UINT_MAX, nullptr}); 1219 PhdrsCommand &PhdrCmd = Opt.PhdrsCommands.back(); 1220 1221 PhdrCmd.Type = readPhdrType(); 1222 do { 1223 Tok = next(); 1224 if (Tok == ";") 1225 break; 1226 if (Tok == "FILEHDR") 1227 PhdrCmd.HasFilehdr = true; 1228 else if (Tok == "PHDRS") 1229 PhdrCmd.HasPhdrs = true; 1230 else if (Tok == "AT") 1231 PhdrCmd.LMAExpr = readParenExpr(); 1232 else if (Tok == "FLAGS") { 1233 expect("("); 1234 // Passing 0 for the value of dot is a bit of a hack. It means that 1235 // we accept expressions like ".|1". 1236 PhdrCmd.Flags = readExpr()(0); 1237 expect(")"); 1238 } else 1239 setError("unexpected header attribute: " + Tok); 1240 } while (!Error); 1241 } 1242 } 1243 1244 void ScriptParser::readSearchDir() { 1245 expect("("); 1246 StringRef Tok = next(); 1247 if (!Config->Nostdlib) 1248 Config->SearchPaths.push_back(unquote(Tok)); 1249 expect(")"); 1250 } 1251 1252 void ScriptParser::readSections() { 1253 Opt.HasSections = true; 1254 // -no-rosegment is used to avoid placing read only non-executable sections in 1255 // their own segment. We do the same if SECTIONS command is present in linker 1256 // script. See comment for computeFlags(). 1257 Config->SingleRoRx = true; 1258 1259 expect("{"); 1260 while (!Error && !consume("}")) { 1261 StringRef Tok = next(); 1262 BaseCommand *Cmd = readProvideOrAssignment(Tok); 1263 if (!Cmd) { 1264 if (Tok == "ASSERT") 1265 Cmd = new AssertCommand(readAssert()); 1266 else 1267 Cmd = readOutputSectionDescription(Tok); 1268 } 1269 Opt.Commands.emplace_back(Cmd); 1270 } 1271 } 1272 1273 static int precedence(StringRef Op) { 1274 return StringSwitch<int>(Op) 1275 .Cases("*", "/", 5) 1276 .Cases("+", "-", 4) 1277 .Cases("<<", ">>", 3) 1278 .Cases("<", "<=", ">", ">=", "==", "!=", 2) 1279 .Cases("&", "|", 1) 1280 .Default(-1); 1281 } 1282 1283 StringMatcher ScriptParser::readFilePatterns() { 1284 std::vector<StringRef> V; 1285 while (!Error && !consume(")")) 1286 V.push_back(next()); 1287 return StringMatcher(V); 1288 } 1289 1290 SortSectionPolicy ScriptParser::readSortKind() { 1291 if (consume("SORT") || consume("SORT_BY_NAME")) 1292 return SortSectionPolicy::Name; 1293 if (consume("SORT_BY_ALIGNMENT")) 1294 return SortSectionPolicy::Alignment; 1295 if (consume("SORT_BY_INIT_PRIORITY")) 1296 return SortSectionPolicy::Priority; 1297 if (consume("SORT_NONE")) 1298 return SortSectionPolicy::None; 1299 return SortSectionPolicy::Default; 1300 } 1301 1302 // Method reads a list of sequence of excluded files and section globs given in 1303 // a following form: ((EXCLUDE_FILE(file_pattern+))? section_pattern+)+ 1304 // Example: *(.foo.1 EXCLUDE_FILE (*a.o) .foo.2 EXCLUDE_FILE (*b.o) .foo.3) 1305 // The semantics of that is next: 1306 // * Include .foo.1 from every file. 1307 // * Include .foo.2 from every file but a.o 1308 // * Include .foo.3 from every file but b.o 1309 std::vector<SectionPattern> ScriptParser::readInputSectionsList() { 1310 std::vector<SectionPattern> Ret; 1311 while (!Error && peek() != ")") { 1312 StringMatcher ExcludeFilePat; 1313 if (consume("EXCLUDE_FILE")) { 1314 expect("("); 1315 ExcludeFilePat = readFilePatterns(); 1316 } 1317 1318 std::vector<StringRef> V; 1319 while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE") 1320 V.push_back(next()); 1321 1322 if (!V.empty()) 1323 Ret.push_back({std::move(ExcludeFilePat), StringMatcher(V)}); 1324 else 1325 setError("section pattern is expected"); 1326 } 1327 return Ret; 1328 } 1329 1330 // Reads contents of "SECTIONS" directive. That directive contains a 1331 // list of glob patterns for input sections. The grammar is as follows. 1332 // 1333 // <patterns> ::= <section-list> 1334 // | <sort> "(" <section-list> ")" 1335 // | <sort> "(" <sort> "(" <section-list> ")" ")" 1336 // 1337 // <sort> ::= "SORT" | "SORT_BY_NAME" | "SORT_BY_ALIGNMENT" 1338 // | "SORT_BY_INIT_PRIORITY" | "SORT_NONE" 1339 // 1340 // <section-list> is parsed by readInputSectionsList(). 1341 InputSectionDescription * 1342 ScriptParser::readInputSectionRules(StringRef FilePattern) { 1343 auto *Cmd = new InputSectionDescription(FilePattern); 1344 expect("("); 1345 while (!Error && !consume(")")) { 1346 SortSectionPolicy Outer = readSortKind(); 1347 SortSectionPolicy Inner = SortSectionPolicy::Default; 1348 std::vector<SectionPattern> V; 1349 if (Outer != SortSectionPolicy::Default) { 1350 expect("("); 1351 Inner = readSortKind(); 1352 if (Inner != SortSectionPolicy::Default) { 1353 expect("("); 1354 V = readInputSectionsList(); 1355 expect(")"); 1356 } else { 1357 V = readInputSectionsList(); 1358 } 1359 expect(")"); 1360 } else { 1361 V = readInputSectionsList(); 1362 } 1363 1364 for (SectionPattern &Pat : V) { 1365 Pat.SortInner = Inner; 1366 Pat.SortOuter = Outer; 1367 } 1368 1369 std::move(V.begin(), V.end(), std::back_inserter(Cmd->SectionPatterns)); 1370 } 1371 return Cmd; 1372 } 1373 1374 InputSectionDescription * 1375 ScriptParser::readInputSectionDescription(StringRef Tok) { 1376 // Input section wildcard can be surrounded by KEEP. 1377 // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep 1378 if (Tok == "KEEP") { 1379 expect("("); 1380 StringRef FilePattern = next(); 1381 InputSectionDescription *Cmd = readInputSectionRules(FilePattern); 1382 expect(")"); 1383 Opt.KeptSections.push_back(Cmd); 1384 return Cmd; 1385 } 1386 return readInputSectionRules(Tok); 1387 } 1388 1389 void ScriptParser::readSort() { 1390 expect("("); 1391 expect("CONSTRUCTORS"); 1392 expect(")"); 1393 } 1394 1395 Expr ScriptParser::readAssert() { 1396 expect("("); 1397 Expr E = readExpr(); 1398 expect(","); 1399 StringRef Msg = unquote(next()); 1400 expect(")"); 1401 return [=](uint64_t Dot) { 1402 uint64_t V = E(Dot); 1403 if (!V) 1404 error(Msg); 1405 return V; 1406 }; 1407 } 1408 1409 // Reads a FILL(expr) command. We handle the FILL command as an 1410 // alias for =fillexp section attribute, which is different from 1411 // what GNU linkers do. 1412 // https://sourceware.org/binutils/docs/ld/Output-Section-Data.html 1413 uint32_t ScriptParser::readFill() { 1414 expect("("); 1415 uint32_t V = readOutputSectionFiller(next()); 1416 expect(")"); 1417 expect(";"); 1418 return V; 1419 } 1420 1421 OutputSectionCommand * 1422 ScriptParser::readOutputSectionDescription(StringRef OutSec) { 1423 OutputSectionCommand *Cmd = new OutputSectionCommand(OutSec); 1424 Cmd->Location = getCurrentLocation(); 1425 1426 // Read an address expression. 1427 // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html#Output-Section-Address 1428 if (peek() != ":") 1429 Cmd->AddrExpr = readExpr(); 1430 1431 expect(":"); 1432 1433 if (consume("AT")) 1434 Cmd->LMAExpr = readParenExpr(); 1435 if (consume("ALIGN")) 1436 Cmd->AlignExpr = readParenExpr(); 1437 if (consume("SUBALIGN")) 1438 Cmd->SubalignExpr = readParenExpr(); 1439 1440 // Parse constraints. 1441 if (consume("ONLY_IF_RO")) 1442 Cmd->Constraint = ConstraintKind::ReadOnly; 1443 if (consume("ONLY_IF_RW")) 1444 Cmd->Constraint = ConstraintKind::ReadWrite; 1445 expect("{"); 1446 1447 while (!Error && !consume("}")) { 1448 StringRef Tok = next(); 1449 if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok)) { 1450 Cmd->Commands.emplace_back(Assignment); 1451 } else if (BytesDataCommand *Data = readBytesDataCommand(Tok)) { 1452 Cmd->Commands.emplace_back(Data); 1453 } else if (Tok == "ASSERT") { 1454 Cmd->Commands.emplace_back(new AssertCommand(readAssert())); 1455 expect(";"); 1456 } else if (Tok == "FILL") { 1457 Cmd->Filler = readFill(); 1458 } else if (Tok == "SORT") { 1459 readSort(); 1460 } else if (peek() == "(") { 1461 Cmd->Commands.emplace_back(readInputSectionDescription(Tok)); 1462 } else { 1463 setError("unknown command " + Tok); 1464 } 1465 } 1466 Cmd->Phdrs = readOutputSectionPhdrs(); 1467 1468 if (consume("=")) 1469 Cmd->Filler = readOutputSectionFiller(next()); 1470 else if (peek().startswith("=")) 1471 Cmd->Filler = readOutputSectionFiller(next().drop_front()); 1472 1473 return Cmd; 1474 } 1475 1476 // Read "=<number>" where <number> is an octal/decimal/hexadecimal number. 1477 // https://sourceware.org/binutils/docs/ld/Output-Section-Fill.html 1478 // 1479 // ld.gold is not fully compatible with ld.bfd. ld.bfd handles 1480 // hexstrings as blobs of arbitrary sizes, while ld.gold handles them 1481 // as 32-bit big-endian values. We will do the same as ld.gold does 1482 // because it's simpler than what ld.bfd does. 1483 uint32_t ScriptParser::readOutputSectionFiller(StringRef Tok) { 1484 uint32_t V; 1485 if (!Tok.getAsInteger(0, V)) 1486 return V; 1487 setError("invalid filler expression: " + Tok); 1488 return 0; 1489 } 1490 1491 SymbolAssignment *ScriptParser::readProvideHidden(bool Provide, bool Hidden) { 1492 expect("("); 1493 SymbolAssignment *Cmd = readAssignment(next()); 1494 Cmd->Provide = Provide; 1495 Cmd->Hidden = Hidden; 1496 expect(")"); 1497 expect(";"); 1498 return Cmd; 1499 } 1500 1501 SymbolAssignment *ScriptParser::readProvideOrAssignment(StringRef Tok) { 1502 SymbolAssignment *Cmd = nullptr; 1503 if (peek() == "=" || peek() == "+=") { 1504 Cmd = readAssignment(Tok); 1505 expect(";"); 1506 } else if (Tok == "PROVIDE") { 1507 Cmd = readProvideHidden(true, false); 1508 } else if (Tok == "HIDDEN") { 1509 Cmd = readProvideHidden(false, true); 1510 } else if (Tok == "PROVIDE_HIDDEN") { 1511 Cmd = readProvideHidden(true, true); 1512 } 1513 return Cmd; 1514 } 1515 1516 static uint64_t getSymbolValue(const Twine &Loc, StringRef S, uint64_t Dot) { 1517 if (S == ".") 1518 return Dot; 1519 return ScriptBase->getSymbolValue(Loc, S); 1520 } 1521 1522 static bool isAbsolute(StringRef S) { 1523 if (S == ".") 1524 return false; 1525 return ScriptBase->isAbsolute(S); 1526 } 1527 1528 SymbolAssignment *ScriptParser::readAssignment(StringRef Name) { 1529 StringRef Op = next(); 1530 Expr E; 1531 assert(Op == "=" || Op == "+="); 1532 if (consume("ABSOLUTE")) { 1533 // The RHS may be something like "ABSOLUTE(.) & 0xff". 1534 // Call readExpr1 to read the whole expression. 1535 E = readExpr1(readParenExpr(), 0); 1536 E.IsAbsolute = [] { return true; }; 1537 } else { 1538 E = readExpr(); 1539 } 1540 if (Op == "+=") { 1541 std::string Loc = getCurrentLocation(); 1542 E = [=](uint64_t Dot) { 1543 return getSymbolValue(Loc, Name, Dot) + E(Dot); 1544 }; 1545 } 1546 return new SymbolAssignment(Name, E); 1547 } 1548 1549 // This is an operator-precedence parser to parse a linker 1550 // script expression. 1551 Expr ScriptParser::readExpr() { return readExpr1(readPrimary(), 0); } 1552 1553 static Expr combine(StringRef Op, Expr L, Expr R) { 1554 if (Op == "*") 1555 return [=](uint64_t Dot) { return L(Dot) * R(Dot); }; 1556 if (Op == "/") { 1557 return [=](uint64_t Dot) -> uint64_t { 1558 uint64_t RHS = R(Dot); 1559 if (RHS == 0) { 1560 error("division by zero"); 1561 return 0; 1562 } 1563 return L(Dot) / RHS; 1564 }; 1565 } 1566 if (Op == "+") 1567 return {[=](uint64_t Dot) { return L(Dot) + R(Dot); }, 1568 [=] { return L.IsAbsolute() && R.IsAbsolute(); }, 1569 [=] { 1570 const OutputSectionBase *S = L.Section(); 1571 return S ? S : R.Section(); 1572 }}; 1573 if (Op == "-") 1574 return [=](uint64_t Dot) { return L(Dot) - R(Dot); }; 1575 if (Op == "<<") 1576 return [=](uint64_t Dot) { return L(Dot) << R(Dot); }; 1577 if (Op == ">>") 1578 return [=](uint64_t Dot) { return L(Dot) >> R(Dot); }; 1579 if (Op == "<") 1580 return [=](uint64_t Dot) { return L(Dot) < R(Dot); }; 1581 if (Op == ">") 1582 return [=](uint64_t Dot) { return L(Dot) > R(Dot); }; 1583 if (Op == ">=") 1584 return [=](uint64_t Dot) { return L(Dot) >= R(Dot); }; 1585 if (Op == "<=") 1586 return [=](uint64_t Dot) { return L(Dot) <= R(Dot); }; 1587 if (Op == "==") 1588 return [=](uint64_t Dot) { return L(Dot) == R(Dot); }; 1589 if (Op == "!=") 1590 return [=](uint64_t Dot) { return L(Dot) != R(Dot); }; 1591 if (Op == "&") 1592 return [=](uint64_t Dot) { return L(Dot) & R(Dot); }; 1593 if (Op == "|") 1594 return [=](uint64_t Dot) { return L(Dot) | R(Dot); }; 1595 llvm_unreachable("invalid operator"); 1596 } 1597 1598 // This is a part of the operator-precedence parser. This function 1599 // assumes that the remaining token stream starts with an operator. 1600 Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { 1601 while (!atEOF() && !Error) { 1602 // Read an operator and an expression. 1603 if (consume("?")) 1604 return readTernary(Lhs); 1605 StringRef Op1 = peek(); 1606 if (precedence(Op1) < MinPrec) 1607 break; 1608 skip(); 1609 Expr Rhs = readPrimary(); 1610 1611 // Evaluate the remaining part of the expression first if the 1612 // next operator has greater precedence than the previous one. 1613 // For example, if we have read "+" and "3", and if the next 1614 // operator is "*", then we'll evaluate 3 * ... part first. 1615 while (!atEOF()) { 1616 StringRef Op2 = peek(); 1617 if (precedence(Op2) <= precedence(Op1)) 1618 break; 1619 Rhs = readExpr1(Rhs, precedence(Op2)); 1620 } 1621 1622 Lhs = combine(Op1, Lhs, Rhs); 1623 } 1624 return Lhs; 1625 } 1626 1627 uint64_t static getConstant(StringRef S) { 1628 if (S == "COMMONPAGESIZE") 1629 return Target->PageSize; 1630 if (S == "MAXPAGESIZE") 1631 return Config->MaxPageSize; 1632 error("unknown constant: " + S); 1633 return 0; 1634 } 1635 1636 // Parses Tok as an integer. Returns true if successful. 1637 // It recognizes hexadecimal (prefixed with "0x" or suffixed with "H") 1638 // and decimal numbers. Decimal numbers may have "K" (kilo) or 1639 // "M" (mega) prefixes. 1640 static bool readInteger(StringRef Tok, uint64_t &Result) { 1641 // Negative number 1642 if (Tok.startswith("-")) { 1643 if (!readInteger(Tok.substr(1), Result)) 1644 return false; 1645 Result = -Result; 1646 return true; 1647 } 1648 1649 // Hexadecimal 1650 if (Tok.startswith_lower("0x")) 1651 return !Tok.substr(2).getAsInteger(16, Result); 1652 if (Tok.endswith_lower("H")) 1653 return !Tok.drop_back().getAsInteger(16, Result); 1654 1655 // Decimal 1656 int Suffix = 1; 1657 if (Tok.endswith_lower("K")) { 1658 Suffix = 1024; 1659 Tok = Tok.drop_back(); 1660 } else if (Tok.endswith_lower("M")) { 1661 Suffix = 1024 * 1024; 1662 Tok = Tok.drop_back(); 1663 } 1664 if (Tok.getAsInteger(10, Result)) 1665 return false; 1666 Result *= Suffix; 1667 return true; 1668 } 1669 1670 BytesDataCommand *ScriptParser::readBytesDataCommand(StringRef Tok) { 1671 int Size = StringSwitch<unsigned>(Tok) 1672 .Case("BYTE", 1) 1673 .Case("SHORT", 2) 1674 .Case("LONG", 4) 1675 .Case("QUAD", 8) 1676 .Default(-1); 1677 if (Size == -1) 1678 return nullptr; 1679 1680 return new BytesDataCommand(readParenExpr(), Size); 1681 } 1682 1683 StringRef ScriptParser::readParenLiteral() { 1684 expect("("); 1685 StringRef Tok = next(); 1686 expect(")"); 1687 return Tok; 1688 } 1689 1690 Expr ScriptParser::readPrimary() { 1691 if (peek() == "(") 1692 return readParenExpr(); 1693 1694 StringRef Tok = next(); 1695 std::string Location = getCurrentLocation(); 1696 1697 if (Tok == "~") { 1698 Expr E = readPrimary(); 1699 return [=](uint64_t Dot) { return ~E(Dot); }; 1700 } 1701 if (Tok == "-") { 1702 Expr E = readPrimary(); 1703 return [=](uint64_t Dot) { return -E(Dot); }; 1704 } 1705 1706 // Built-in functions are parsed here. 1707 // https://sourceware.org/binutils/docs/ld/Builtin-Functions.html. 1708 if (Tok == "ADDR") { 1709 StringRef Name = readParenLiteral(); 1710 return {[=](uint64_t Dot) { 1711 return ScriptBase->getOutputSection(Location, Name)->Addr; 1712 }, 1713 [=] { return false; }, 1714 [=] { return ScriptBase->getOutputSection(Location, Name); }}; 1715 } 1716 if (Tok == "LOADADDR") { 1717 StringRef Name = readParenLiteral(); 1718 return [=](uint64_t Dot) { 1719 return ScriptBase->getOutputSection(Location, Name)->getLMA(); 1720 }; 1721 } 1722 if (Tok == "ASSERT") 1723 return readAssert(); 1724 if (Tok == "ALIGN") { 1725 expect("("); 1726 Expr E = readExpr(); 1727 if (consume(",")) { 1728 Expr E2 = readExpr(); 1729 expect(")"); 1730 return [=](uint64_t Dot) { return alignTo(E(Dot), E2(Dot)); }; 1731 } 1732 expect(")"); 1733 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1734 } 1735 if (Tok == "CONSTANT") { 1736 StringRef Name = readParenLiteral(); 1737 return [=](uint64_t Dot) { return getConstant(Name); }; 1738 } 1739 if (Tok == "DEFINED") { 1740 StringRef Name = readParenLiteral(); 1741 return [=](uint64_t Dot) { return ScriptBase->isDefined(Name) ? 1 : 0; }; 1742 } 1743 if (Tok == "SEGMENT_START") { 1744 expect("("); 1745 skip(); 1746 expect(","); 1747 Expr E = readExpr(); 1748 expect(")"); 1749 return [=](uint64_t Dot) { return E(Dot); }; 1750 } 1751 if (Tok == "DATA_SEGMENT_ALIGN") { 1752 expect("("); 1753 Expr E = readExpr(); 1754 expect(","); 1755 readExpr(); 1756 expect(")"); 1757 return [=](uint64_t Dot) { return alignTo(Dot, E(Dot)); }; 1758 } 1759 if (Tok == "DATA_SEGMENT_END") { 1760 expect("("); 1761 expect("."); 1762 expect(")"); 1763 return [](uint64_t Dot) { return Dot; }; 1764 } 1765 // GNU linkers implements more complicated logic to handle 1766 // DATA_SEGMENT_RELRO_END. We instead ignore the arguments and just align to 1767 // the next page boundary for simplicity. 1768 if (Tok == "DATA_SEGMENT_RELRO_END") { 1769 expect("("); 1770 readExpr(); 1771 expect(","); 1772 readExpr(); 1773 expect(")"); 1774 return [](uint64_t Dot) { return alignTo(Dot, Target->PageSize); }; 1775 } 1776 if (Tok == "SIZEOF") { 1777 StringRef Name = readParenLiteral(); 1778 return [=](uint64_t Dot) { return ScriptBase->getOutputSectionSize(Name); }; 1779 } 1780 if (Tok == "ALIGNOF") { 1781 StringRef Name = readParenLiteral(); 1782 return [=](uint64_t Dot) { 1783 return ScriptBase->getOutputSection(Location, Name)->Addralign; 1784 }; 1785 } 1786 if (Tok == "SIZEOF_HEADERS") 1787 return [=](uint64_t Dot) { return ScriptBase->getHeaderSize(); }; 1788 1789 // Tok is a literal number. 1790 uint64_t V; 1791 if (readInteger(Tok, V)) 1792 return [=](uint64_t Dot) { return V; }; 1793 1794 // Tok is a symbol name. 1795 if (Tok != "." && !isValidCIdentifier(Tok)) 1796 setError("malformed number: " + Tok); 1797 return {[=](uint64_t Dot) { return getSymbolValue(Location, Tok, Dot); }, 1798 [=] { return isAbsolute(Tok); }, 1799 [=] { return ScriptBase->getSymbolSection(Tok); }}; 1800 } 1801 1802 Expr ScriptParser::readTernary(Expr Cond) { 1803 Expr L = readExpr(); 1804 expect(":"); 1805 Expr R = readExpr(); 1806 return [=](uint64_t Dot) { return Cond(Dot) ? L(Dot) : R(Dot); }; 1807 } 1808 1809 Expr ScriptParser::readParenExpr() { 1810 expect("("); 1811 Expr E = readExpr(); 1812 expect(")"); 1813 return E; 1814 } 1815 1816 std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() { 1817 std::vector<StringRef> Phdrs; 1818 while (!Error && peek().startswith(":")) { 1819 StringRef Tok = next(); 1820 Phdrs.push_back((Tok.size() == 1) ? next() : Tok.substr(1)); 1821 } 1822 return Phdrs; 1823 } 1824 1825 // Read a program header type name. The next token must be a 1826 // name of a program header type or a constant (e.g. "0x3"). 1827 unsigned ScriptParser::readPhdrType() { 1828 StringRef Tok = next(); 1829 uint64_t Val; 1830 if (readInteger(Tok, Val)) 1831 return Val; 1832 1833 unsigned Ret = StringSwitch<unsigned>(Tok) 1834 .Case("PT_NULL", PT_NULL) 1835 .Case("PT_LOAD", PT_LOAD) 1836 .Case("PT_DYNAMIC", PT_DYNAMIC) 1837 .Case("PT_INTERP", PT_INTERP) 1838 .Case("PT_NOTE", PT_NOTE) 1839 .Case("PT_SHLIB", PT_SHLIB) 1840 .Case("PT_PHDR", PT_PHDR) 1841 .Case("PT_TLS", PT_TLS) 1842 .Case("PT_GNU_EH_FRAME", PT_GNU_EH_FRAME) 1843 .Case("PT_GNU_STACK", PT_GNU_STACK) 1844 .Case("PT_GNU_RELRO", PT_GNU_RELRO) 1845 .Case("PT_OPENBSD_RANDOMIZE", PT_OPENBSD_RANDOMIZE) 1846 .Case("PT_OPENBSD_WXNEEDED", PT_OPENBSD_WXNEEDED) 1847 .Case("PT_OPENBSD_BOOTDATA", PT_OPENBSD_BOOTDATA) 1848 .Default(-1); 1849 1850 if (Ret == (unsigned)-1) { 1851 setError("invalid program header type: " + Tok); 1852 return PT_NULL; 1853 } 1854 return Ret; 1855 } 1856 1857 // Reads a list of symbols, e.g. "{ global: foo; bar; local: *; };". 1858 void ScriptParser::readAnonymousDeclaration() { 1859 // Read global symbols first. "global:" is default, so if there's 1860 // no label, we assume global symbols. 1861 if (consume("global:") || peek() != "local:") 1862 Config->VersionScriptGlobals = readSymbols(); 1863 1864 // Next, read local symbols. 1865 if (consume("local:")) { 1866 if (consume("*")) { 1867 Config->DefaultSymbolVersion = VER_NDX_LOCAL; 1868 expect(";"); 1869 } else { 1870 setError("local symbol list for anonymous version is not supported"); 1871 } 1872 } 1873 expect("}"); 1874 expect(";"); 1875 } 1876 1877 // Reads a list of symbols, e.g. "VerStr { global: foo; bar; local: *; };". 1878 void ScriptParser::readVersionDeclaration(StringRef VerStr) { 1879 // Identifiers start at 2 because 0 and 1 are reserved 1880 // for VER_NDX_LOCAL and VER_NDX_GLOBAL constants. 1881 uint16_t VersionId = Config->VersionDefinitions.size() + 2; 1882 Config->VersionDefinitions.push_back({VerStr, VersionId}); 1883 1884 // Read global symbols. 1885 if (consume("global:") || peek() != "local:") 1886 Config->VersionDefinitions.back().Globals = readSymbols(); 1887 1888 // Read local symbols. 1889 if (consume("local:")) { 1890 if (consume("*")) { 1891 Config->DefaultSymbolVersion = VER_NDX_LOCAL; 1892 expect(";"); 1893 } else { 1894 for (SymbolVersion V : readSymbols()) 1895 Config->VersionScriptLocals.push_back(V); 1896 } 1897 } 1898 expect("}"); 1899 1900 // Each version may have a parent version. For example, "Ver2" 1901 // defined as "Ver2 { global: foo; local: *; } Ver1;" has "Ver1" 1902 // as a parent. This version hierarchy is, probably against your 1903 // instinct, purely for hint; the runtime doesn't care about it 1904 // at all. In LLD, we simply ignore it. 1905 if (peek() != ";") 1906 skip(); 1907 expect(";"); 1908 } 1909 1910 // Reads a list of symbols for a versions cript. 1911 std::vector<SymbolVersion> ScriptParser::readSymbols() { 1912 std::vector<SymbolVersion> Ret; 1913 for (;;) { 1914 if (consume("extern")) { 1915 for (SymbolVersion V : readVersionExtern()) 1916 Ret.push_back(V); 1917 continue; 1918 } 1919 1920 if (peek() == "}" || peek() == "local:" || Error) 1921 break; 1922 StringRef Tok = next(); 1923 Ret.push_back({unquote(Tok), false, hasWildcard(Tok)}); 1924 expect(";"); 1925 } 1926 return Ret; 1927 } 1928 1929 // Reads an "extern C++" directive, e.g., 1930 // "extern "C++" { ns::*; "f(int, double)"; };" 1931 std::vector<SymbolVersion> ScriptParser::readVersionExtern() { 1932 StringRef Tok = next(); 1933 bool IsCXX = Tok == "\"C++\""; 1934 if (!IsCXX && Tok != "\"C\"") 1935 setError("Unknown language"); 1936 expect("{"); 1937 1938 std::vector<SymbolVersion> Ret; 1939 while (!Error && peek() != "}") { 1940 StringRef Tok = next(); 1941 bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok); 1942 Ret.push_back({unquote(Tok), IsCXX, HasWildcard}); 1943 expect(";"); 1944 } 1945 1946 expect("}"); 1947 expect(";"); 1948 return Ret; 1949 } 1950 1951 void elf::readLinkerScript(MemoryBufferRef MB) { 1952 ScriptParser(MB).readLinkerScript(); 1953 } 1954 1955 void elf::readVersionScript(MemoryBufferRef MB) { 1956 ScriptParser(MB).readVersionScript(); 1957 } 1958 1959 void elf::readDynamicList(MemoryBufferRef MB) { 1960 ScriptParser(MB).readDynamicList(); 1961 } 1962 1963 template class elf::LinkerScript<ELF32LE>; 1964 template class elf::LinkerScript<ELF32BE>; 1965 template class elf::LinkerScript<ELF64LE>; 1966 template class elf::LinkerScript<ELF64BE>; 1967