Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -275,8 +275,8 @@ template static void finalizeShtGroup(OutputSection *OS, - ArrayRef Sections) { - assert(Config->Relocatable && Sections.size() == 1); + InputSection *Section) { + assert(Config->Relocatable); // sh_link field for SHT_GROUP sections should contain the section index of // the symbol table. @@ -284,17 +284,19 @@ // sh_info then contain index of an entry in symbol table section which // provides signature of the section group. - ObjFile *Obj = Sections[0]->getFile(); + ObjFile *Obj = Section->getFile(); ArrayRef Symbols = Obj->getSymbols(); - OS->Info = InX::SymTab->getSymbolIndex(Symbols[Sections[0]->Info]); + OS->Info = InX::SymTab->getSymbolIndex(Symbols[Section->Info]); } template void OutputSection::finalize() { - std::vector Sections; + InputSection *First = nullptr; for (BaseCommand *Base : SectionCommands) { if (auto *ISD = dyn_cast(Base)) { - for (InputSection *&IS : ISD->Sections) - Sections.push_back(IS); + if (ISD->Sections.empty()) + continue; + if (First == nullptr) + First = ISD->Sections.front(); } if (isa(Base) && Type == SHT_NOBITS) Type = SHT_PROGBITS; @@ -305,19 +307,18 @@ // SHF_LINK_ORDER flag. The dependency is indicated by the sh_link field. We // need to translate the InputSection sh_link to the OutputSection sh_link, // all InputSections in the OutputSection have the same dependency. - if (auto *D = Sections.front()->getLinkOrderDep()) + if (auto *D = First->getLinkOrderDep()) Link = D->getParent()->SectionIndex; } if (Type == SHT_GROUP) { - finalizeShtGroup(this, Sections); + finalizeShtGroup(this, First); return; } if (!Config->CopyRelocs || (Type != SHT_RELA && Type != SHT_REL)) return; - InputSection *First = Sections[0]; if (isa(First)) return;