diff options
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 33 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/sections-constraint3.s | 11 |
2 files changed, 29 insertions, 15 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index ea38f0efef5..e6c60937161 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -208,24 +208,14 @@ LinkerScript<ELFT>::createInputSectionList(OutputSectionCommand &OutCmd) { std::vector<InputSectionBase<ELFT> *> Ret; for (const std::unique_ptr<BaseCommand> &Base : OutCmd.Commands) { - if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) { - if (shouldDefine<ELFT>(OutCmd)) - addSymbol<ELFT>(OutCmd); + auto *Cmd = dyn_cast<InputSectionDescription>(Base.get()); + if (!Cmd) continue; - } - - auto *Cmd = cast<InputSectionDescription>(Base.get()); computeInputSections(Cmd); for (InputSectionData *S : Cmd->Sections) Ret.push_back(static_cast<InputSectionBase<ELFT> *>(S)); } - if (!matchConstraints<ELFT>(Ret, OutCmd.Constraint)) { - for (InputSectionBase<ELFT> *S : Ret) - S->OutSec = nullptr; - Ret.clear(); - } - return Ret; } @@ -275,7 +265,9 @@ void LinkerScript<ELFT>::addSection(OutputSectionFactory<ELFT> &Factory, template <class ELFT> void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) { - for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) { + for (unsigned I = 0; I < Opt.Commands.size(); ++I) { + auto Iter = Opt.Commands.begin() + I; + const std::unique_ptr<BaseCommand> &Base1 = *Iter; if (auto *Cmd = dyn_cast<SymbolAssignment>(Base1.get())) { if (shouldDefine<ELFT>(Cmd)) addRegular<ELFT>(Cmd); @@ -298,6 +290,18 @@ void LinkerScript<ELFT>::processCommands(OutputSectionFactory<ELFT> &Factory) { continue; } + if (!matchConstraints<ELFT>(V, Cmd->Constraint)) { + for (InputSectionBase<ELFT> *S : V) + S->OutSec = nullptr; + Opt.Commands.erase(Iter); + continue; + } + + for (const std::unique_ptr<BaseCommand> &Base : Cmd->Commands) + if (auto *OutCmd = dyn_cast<SymbolAssignment>(Base.get())) + if (shouldDefine<ELFT>(OutCmd)) + addSymbol<ELFT>(OutCmd); + if (V.empty()) continue; @@ -410,8 +414,7 @@ findSections(OutputSectionCommand &Cmd, const std::vector<OutputSectionBase<ELFT> *> &Sections) { std::vector<OutputSectionBase<ELFT> *> Ret; for (OutputSectionBase<ELFT> *Sec : Sections) - if (Sec->getName() == Cmd.Name && - checkConstraint(Sec->getFlags(), Cmd.Constraint)) + if (Sec->getName() == Cmd.Name) Ret.push_back(Sec); return Ret; } diff --git a/lld/test/ELF/linkerscript/sections-constraint3.s b/lld/test/ELF/linkerscript/sections-constraint3.s new file mode 100644 index 00000000000..259f11e91dd --- /dev/null +++ b/lld/test/ELF/linkerscript/sections-constraint3.s @@ -0,0 +1,11 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: echo "SECTIONS { zed : ONLY_IF_RO { abc = 1; *(foo) } }" > %t.script +# RUN: ld.lld -T %t.script %t.o -o %t.so -shared +# RUN: llvm-readobj -t %t.so | FileCheck %s + +# CHECK: Symbols [ +# CHECK-NOT: abc + +.section foo,"aw" +.quad 1 |

