Index: llvm/test/tools/llvm-objcopy/ELF/remove-section-in-group.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-objcopy/ELF/remove-section-in-group.test @@ -0,0 +1,37 @@ +# RUN: yaml2obj %s -o - \ +# RUN: | llvm-objcopy -R .foo - - \ +# RUN: | obj2yaml - \ +# RUN: | FileCheck %s + +## This checks that the group section is shrunk when its member is removed. + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .group + Type: SHT_GROUP + Link: .symtab + Info: foo_bar_grp + Members: + - SectionOrType: GRP_COMDAT + - SectionOrType: .foo + - SectionOrType: .bar + - Name: .foo + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_GROUP ] + - Name: .bar + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_GROUP ] +Symbols: + - Name: foo_bar_grp + Section: .group + +# CHECK: - Name: .group +# CHECK: Members: +# CHECK-NEXT: - SectionOrType: GRP_COMDAT +# CHECK-NEXT: - SectionOrType: .bar +# CHECK-NOT: - SectionOrType: Index: llvm/tools/llvm-objcopy/ELF/Object.h =================================================================== --- llvm/tools/llvm-objcopy/ELF/Object.h +++ llvm/tools/llvm-objcopy/ELF/Object.h @@ -799,6 +799,9 @@ void accept(SectionVisitor &) const override; void accept(MutableSectionVisitor &Visitor) override; void finalize() override; + Error removeSectionReferences( + bool AllowBrokenLinks, + function_ref ToRemove) override; Error removeSymbols(function_ref ToRemove) override; void markSymbols() override; void replaceSectionReferences( Index: llvm/tools/llvm-objcopy/ELF/Object.cpp =================================================================== --- llvm/tools/llvm-objcopy/ELF/Object.cpp +++ llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -111,7 +111,9 @@ template void ELFSectionSizer::visit(GnuDebugLinkSection &Sec) {} -template void ELFSectionSizer::visit(GroupSection &Sec) {} +template void ELFSectionSizer::visit(GroupSection &Sec) { + Sec.Size = sizeof(Elf_Word) + Sec.GroupMembers.size() * sizeof(Elf_Word); +} template void ELFSectionSizer::visit(SectionIndexSection &Sec) {} @@ -967,6 +969,12 @@ this->Link = SymTab->Index; } +Error GroupSection::removeSectionReferences( + bool AllowBrokenLinks, function_ref ToRemove) { + llvm::erase_if(GroupMembers, ToRemove); + return Error::success(); +} + Error GroupSection::removeSymbols(function_ref ToRemove) { if (ToRemove(*Sym)) return createStringError(llvm::errc::invalid_argument,