Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -323,7 +323,7 @@ fatal(toString(this) + ": invalid sh_link index: " + Twine(Sec.sh_link)); auto *IS = cast>(Sections[Sec.sh_link]); - IS->DependentSection = Sections[I]; + IS->DependentSections.push_back(Sections[I]); } } } Index: lld/trunk/ELF/InputSection.h =================================================================== --- lld/trunk/ELF/InputSection.h +++ lld/trunk/ELF/InputSection.h @@ -281,8 +281,8 @@ // to. The writer sets a value. uint64_t OutSecOff = 0; - // InputSection that is dependent on us (reverse dependency for GC) - InputSectionBase *DependentSection = nullptr; + // InputSections that are dependent on us (reverse dependency for GC) + llvm::TinyPtrVector *> DependentSections; static bool classof(const InputSectionData *S); Index: lld/trunk/ELF/MarkLive.cpp =================================================================== --- lld/trunk/ELF/MarkLive.cpp +++ lld/trunk/ELF/MarkLive.cpp @@ -87,8 +87,8 @@ for (const typename ELFT::Rel &Rel : Sec.rels()) Fn(resolveReloc(Sec, Rel)); } - if (Sec.DependentSection) - Fn({Sec.DependentSection, 0}); + for (InputSectionBase *IS : Sec.DependentSections) + Fn({IS, 0}); } // The .eh_frame section is an unfortunate special case. Index: lld/trunk/test/ELF/gc-sections-metadata2.s =================================================================== --- lld/trunk/test/ELF/gc-sections-metadata2.s +++ lld/trunk/test/ELF/gc-sections-metadata2.s @@ -0,0 +1,19 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld --gc-sections %t.o -o %t +# RUN: llvm-objdump -section-headers %t | FileCheck %s + +# CHECK: .foo +# CHECK: .bar +# CHECK: .zed + +.globl _start +_start: +.quad .foo + +.section .foo,"a" +.quad 0 +.section .bar,"am",@progbits,.foo +.quad 0 +.section .zed,"am",@progbits,.foo +.quad 0