[lld] r327374 - [ELF] - Drop special flags for empty output sections.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 13 01:32:57 PDT 2018


Author: grimar
Date: Tue Mar 13 01:32:56 2018
New Revision: 327374

URL: http://llvm.org/viewvc/llvm-project?rev=327374&view=rev
Log:
[ELF] - Drop special flags for empty output sections.

This fixes PR36598.

LLD currently crashes when we have empty output section
with SHF_LINK_ORDER flag. This might happen if we place an 
empty synthetic section in the linker script, but keep output
section alive with the use of additional symbol, for example.

The patch fixes the issue by dropping all special flags
for empty sections.

Differential revision: https://reviews.llvm.org/D44376

Added:
    lld/trunk/test/ELF/linkerscript/empty-link-order.test
Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=327374&r1=327373&r2=327374&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Tue Mar 13 01:32:56 2018
@@ -813,7 +813,7 @@ static bool isDiscardable(OutputSection
   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::adjustSectionsBeforeS
       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;
     }

Added: lld/trunk/test/ELF/linkerscript/empty-link-order.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/empty-link-order.test?rev=327374&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/empty-link-order.test (added)
+++ lld/trunk/test/ELF/linkerscript/empty-link-order.test Tue Mar 13 01:32:56 2018
@@ -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:  ]




More information about the llvm-commits mailing list