summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/LinkerScript.cpp18
-rw-r--r--lld/test/ELF/linkerscript/empty-link-order.test21
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: ]
OpenPOWER on IntegriCloud