diff options
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 18 | ||||
-rw-r--r-- | lld/test/ELF/linkerscript/empty-link-order.test | 21 |
2 files changed, 32 insertions, 7 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index e4b3bc99210..fcfe0783300 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -813,7 +813,7 @@ static bool isDiscardable(OutputSection &Sec) { for (BaseCommand *Base : Sec.SectionCommands) if (!isa<InputSectionDescription>(*Base)) return false; - return getInputSections(&Sec).empty(); + return true; } void LinkerScript::adjustSectionsBeforeSorting() { @@ -845,14 +845,18 @@ void LinkerScript::adjustSectionsBeforeSorting() { continue; // A live output section means that some input section was added to it. It - // might have been removed (gc, or empty synthetic section), but we at least - // know the flags. + // might have been removed (if it was empty synthetic section), but we at + // least know the flags. if (Sec->Live) - Flags = Sec->Flags & (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR); - else - Sec->Flags = Flags; + Flags = Sec->Flags; - if (isDiscardable(*Sec)) { + // We do not want to keep any special flags for output section + // in case it is empty. + bool IsEmpty = getInputSections(Sec).empty(); + if (IsEmpty) + Sec->Flags = Flags & (SHF_ALLOC | SHF_WRITE | SHF_EXECINSTR); + + if (IsEmpty && isDiscardable(*Sec)) { Sec->Live = false; Cmd = nullptr; } diff --git a/lld/test/ELF/linkerscript/empty-link-order.test b/lld/test/ELF/linkerscript/empty-link-order.test new file mode 100644 index 00000000000..eb9f1b34760 --- /dev/null +++ b/lld/test/ELF/linkerscript/empty-link-order.test @@ -0,0 +1,21 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=arm-arm-none-eabi -o %t.o < /dev/null + +SECTIONS { + .foo : { + bar = .; + *(.ARM.exidx*) + } +} + +# RUN: ld.lld %t.o -o %t --script %s + +## Check we do not crash and do not set SHF_LINK_ORDER flag for .foo +# RUN: llvm-readobj -s %t | FileCheck %s +# CHECK: Section { +# CHECK: Index: +# CHECK: Name: .foo +# CHECK-NEXT: Type: SHT_ARM_EXIDX +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: ] |