Index: lld/trunk/ELF/MarkLive.cpp =================================================================== --- lld/trunk/ELF/MarkLive.cpp +++ lld/trunk/ELF/MarkLive.cpp @@ -175,9 +175,6 @@ case SHT_PREINIT_ARRAY: return true; default: - if (Sec->Flags & SHF_LINK_ORDER) - return false; - if (!(Sec->Flags & SHF_ALLOC)) return true; @@ -247,6 +244,8 @@ // referred by .eh_frame here. if (auto *EH = dyn_cast_or_null(Sec)) scanEhFrameSection(*EH, Enqueue); + if (Sec->Flags & SHF_LINK_ORDER) + continue; if (isReserved(Sec) || Script::X->shouldKeep(Sec)) Enqueue({Sec, 0}); else if (isValidCIdentifier(Sec->Name)) { Index: lld/trunk/test/ELF/gc-sections-metadata-startstop.s =================================================================== --- lld/trunk/test/ELF/gc-sections-metadata-startstop.s +++ lld/trunk/test/ELF/gc-sections-metadata-startstop.s @@ -0,0 +1,33 @@ +# LINK_ORDER cnamed sections are not kept alive by the __start_* reference. +# 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 %t | FileCheck %s + +# CHECK: Sections: +# CHECK-NOT: yy +# CHECK: xx {{.*}} DATA +# CHECK-NOT: yy + +# CHECK: SYMBOL TABLE: +# CHECK: xx 00000000 __start_xx +# CHECK: w *UND* 00000000 __start_yy + +.weak __start_xx +.weak __start_yy + +.global _start +_start: +.quad __start_xx +.quad __start_yy + +.section xx,"a" +.quad 0 + +.section .foo,"a" +.quad 0 + +.section yy,"am",@progbits,.foo +.quad 0 +