diff options
-rw-r--r-- | lld/ELF/MarkLive.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/gc-sections-metadata.s | 38 |
2 files changed, 41 insertions, 0 deletions
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index 8d129fc3ff1..ceafa7e6407 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -167,6 +167,9 @@ template <class ELFT> static bool isReserved(InputSectionBase<ELFT> *Sec) { case SHT_PREINIT_ARRAY: return true; default: + if (Sec->Flags & SHF_LINK_ORDER) + return false; + if (!(Sec->Flags & SHF_ALLOC)) return true; diff --git a/lld/test/ELF/gc-sections-metadata.s b/lld/test/ELF/gc-sections-metadata.s new file mode 100644 index 00000000000..059f82e0964 --- /dev/null +++ b/lld/test/ELF/gc-sections-metadata.s @@ -0,0 +1,38 @@ +# 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: 1 .foo1 +# CHECK-NEXT: bar1 +# CHECK-NEXT: .zed1 +# CHECK-NEXT: .text +# CHECK-NEXT: .comment +# CHECK-NEXT: .symtab +# CHECK-NEXT: .shstrtab +# CHECK-NEXT: .strtab + +.global _start +_start: +.quad .foo1 + +.section .foo1,"a" +.quad 0 + +.section .foo2,"a" +.quad 0 + +.section bar1,"am",@progbits,.foo1 +.quad .zed1 +.quad .foo1 + +.section bar2,"am",@progbits,.foo2 +.quad .zed2 +.quad .foo2 + +.section .zed1,"a" +.quad 0 + +.section .zed2,"a" +.quad 0 |