diff options
| -rw-r--r-- | lld/ELF/MarkLive.cpp | 5 | ||||
| -rw-r--r-- | lld/test/ELF/gc-sections-metadata-startstop.s | 33 |
2 files changed, 35 insertions, 3 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index e1bc64d925c..adee7516913 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -175,9 +175,6 @@ template <class ELFT> static bool isReserved(InputSectionBase *Sec) { 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 @@ template <class ELFT> void elf::markLive() { // referred by .eh_frame here. if (auto *EH = dyn_cast_or_null<EhInputSection>(Sec)) scanEhFrameSection<ELFT>(*EH, Enqueue); + if (Sec->Flags & SHF_LINK_ORDER) + continue; if (isReserved<ELFT>(Sec) || Script<ELFT>::X->shouldKeep(Sec)) Enqueue({Sec, 0}); else if (isValidCIdentifier(Sec->Name)) { diff --git a/lld/test/ELF/gc-sections-metadata-startstop.s b/lld/test/ELF/gc-sections-metadata-startstop.s new file mode 100644 index 00000000000..620c419c992 --- /dev/null +++ b/lld/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 + |

