[lld] r345819 - [ELF] - Do not crash when -r output uses linker script with `/DISCARD/`

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 1 02:20:06 PDT 2018


Author: grimar
Date: Thu Nov  1 02:20:06 2018
New Revision: 345819

URL: http://llvm.org/viewvc/llvm-project?rev=345819&view=rev
Log:
[ELF] - Do not crash when -r output uses linker script with `/DISCARD/`

This is https://bugs.llvm.org/show_bug.cgi?id=39493.

We crashed previously because did not handle /DISCARD/ properly
when -r was used. I think it is uncommon to use scripts with -r, though I see
nothing wrong to handle the /DISCARD/ so that we will not crash at least.

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

Added:
    lld/trunk/test/ELF/linkerscript/relocatable-discard.s
Modified:
    lld/trunk/ELF/InputFiles.cpp
    lld/trunk/ELF/InputSection.cpp

Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=345819&r1=345818&r2=345819&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Thu Nov  1 02:20:06 2018
@@ -645,8 +645,16 @@ InputSectionBase *ObjFile<ELFT>::createI
     // This section contains relocation information.
     // If -r is given, we do not interpret or apply relocation
     // but just copy relocation sections to output.
-    if (Config->Relocatable)
-      return make<InputSection>(*this, Sec, Name);
+    if (Config->Relocatable) {
+      InputSection *RelocSec = make<InputSection>(*this, Sec, Name);
+      // We want to add a dependency to target, similar like we do for
+      // -emit-relocs below. This is useful for the case when linker script
+      // contains the "/DISCARD/". It is perhaps uncommon to use a script with
+      // -r, but we faced it in the Linux kernel and have to handle such case
+      // and not to crash.
+      Target->DependentSections.push_back(RelocSec);
+      return RelocSec;
+    }
 
     if (Target->FirstRelocation)
       fatal(toString(this) +

Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=345819&r1=345818&r2=345819&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Thu Nov  1 02:20:06 2018
@@ -432,8 +432,8 @@ void InputSection::copyRelocations(uint8
         error("STT_SECTION symbol should be defined");
         continue;
       }
-      SectionBase *Section = D->Section;
-      if (Section == &InputSection::Discarded) {
+      SectionBase *Section = D->Section->Repl;
+      if (!Section->Live) {
         P->setSymbolAndType(0, 0, false);
         continue;
       }
@@ -460,7 +460,7 @@ void InputSection::copyRelocations(uint8
       }
 
       if (RelTy::IsRela)
-        P->r_addend = Sym.getVA(Addend) - Section->Repl->getOutputSection()->Addr;
+        P->r_addend = Sym.getVA(Addend) - Section->getOutputSection()->Addr;
       else if (Config->Relocatable)
         Sec->Relocations.push_back({R_ABS, Type, Rel.r_offset, Addend, &Sym});
     }

Added: lld/trunk/test/ELF/linkerscript/relocatable-discard.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/relocatable-discard.s?rev=345819&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/relocatable-discard.s (added)
+++ lld/trunk/test/ELF/linkerscript/relocatable-discard.s Thu Nov  1 02:20:06 2018
@@ -0,0 +1,21 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { /DISCARD/ : { *(.discard.*) }}" > %t.script
+# RUN: ld.lld -o %t --script %t.script -r %t.o
+# RUN: llvm-readobj -sections %t | FileCheck %s
+
+## Test shows that we do not crash after discarding the .discard.foo with -r.
+## Previously it happened because of 2 reasons:
+## 1) .rela.discard.foo was not handled properly and was not discarded.
+##    Remaining reference was invalid and caused the crash.
+## 2) Third-party section .debug_info referencing discarded section
+##    did not handle this case properly and tried to apply the
+##    relocation instead of ignoring it.
+
+# CHECK-NOT: .discard
+
+.section .discard.foo,"ax"
+callq fn at PLT
+
+.section .debug_info,"", at progbits
+.long .discard.foo




More information about the llvm-commits mailing list