[lld] r284010 - Alternative fix for reloc tareting discarded section

Eugene Leviant via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 12 05:31:37 PDT 2016


Author: evgeny777
Date: Wed Oct 12 07:31:34 2016
New Revision: 284010

URL: http://llvm.org/viewvc/llvm-project?rev=284010&view=rev
Log:
Alternative fix for reloc tareting discarded section

r283984 introduced a problem of too many warning messages being shown
when -ffunction-sections and -fdata-sections were used in conjunction 
with --gc-sections linker flag and debugging information present. This
happens because lot of relocations from .debug_line section may become
invalid in such case. The newer fix doesn't show any warning message but
zeroes OutSec pointer in createInputSectionList() to avoid crash, when
relocations are written

Modified:
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/ELF/Symbols.cpp
    lld/trunk/test/ELF/linkerscript/discard-section.s

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=284010&r1=284009&r2=284010&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Wed Oct 12 07:31:34 2016
@@ -239,6 +239,12 @@ LinkerScript<ELFT>::createInputSectionLi
       Ret.push_back(static_cast<InputSectionBase<ELFT> *>(S));
   }
 
+  // After we created final list we should now set OutSec pointer to null,
+  // instead of -1. Otherwise we may get a crash when writing relocs, in 
+  // case section is discarded by linker script
+  for (InputSectionBase<ELFT> *S : Ret)
+    S->OutSec = nullptr;
+
   return Ret;
 }
 

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=284010&r1=284009&r2=284010&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Wed Oct 12 07:31:34 2016
@@ -25,12 +25,6 @@ using namespace lld;
 using namespace lld::elf;
 
 template <class ELFT>
-static std::string getSectionName(InputSectionBase<ELFT> *S) {
-  StringRef Filename = S->getFile()->getName();
-  return (sys::path::filename(Filename) + "(" + S->Name + ")").str();
-}
-
-template <class ELFT>
 static typename ELFT::uint getSymVA(const SymbolBody &Body,
                                     typename ELFT::uint &Addend) {
   typedef typename ELFT::uint uintX_t;
@@ -60,11 +54,6 @@ static typename ELFT::uint getSymVA(cons
     if (!SC)
       return D.Value;
 
-    if (!SC->Live) {
-      warn("relocation refers to discarded section '" + getSectionName(SC) + "'");
-      return 0;
-    }
-
     uintX_t Offset = D.Value;
     if (D.isSection()) {
       Offset += Addend;

Modified: lld/trunk/test/ELF/linkerscript/discard-section.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/discard-section.s?rev=284010&r1=284009&r2=284010&view=diff
==============================================================================
--- lld/trunk/test/ELF/linkerscript/discard-section.s (original)
+++ lld/trunk/test/ELF/linkerscript/discard-section.s Wed Oct 12 07:31:34 2016
@@ -1,10 +1,9 @@
 # REQUIRES: x86
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
 # RUN: echo "SECTIONS { /DISCARD/ : { *(.aaa*) } }" > %t.script
-# RUN: ld.lld -o %t1 --script %t.script %t 2>&1 | FileCheck --check-prefix=WARN %s
+# RUN: ld.lld -o %t1 --script %t.script %t
 # RUN: llvm-objdump -section-headers %t1 | FileCheck %s
 
-# WARN: relocation refers to discarded section {{.+}}(.aaa)
 # CHECK-NOT: .aaa
 
 .section .aaa,"a"




More information about the llvm-commits mailing list