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