Index: ELF/MarkLive.cpp =================================================================== --- ELF/MarkLive.cpp +++ 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: test/ELF/gc-sections-metadata-startstop.s =================================================================== --- /dev/null +++ test/ELF/gc-sections-metadata-startstop.s @@ -0,0 +1,28 @@ +# 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 | FileCheck %s + +# CHECK-NOT: yy +# CHECK: xx +# CHECK-NOT: 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 +