[PATCH] D40235: COFF: Correctly handle relocations against early discarded sections.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 20 11:37:30 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL318689: COFF: Correctly handle relocations against early discarded sections. (authored by pcc).

Changed prior to commit:
  https://reviews.llvm.org/D40235?vs=123540&id=123628#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D40235

Files:
  lld/trunk/COFF/Chunks.cpp
  lld/trunk/COFF/MarkLive.cpp
  lld/trunk/test/COFF/reloc-discarded-early.s
  lld/trunk/test/COFF/reloc-discarded-early2.s


Index: lld/trunk/test/COFF/reloc-discarded-early.s
===================================================================
--- lld/trunk/test/COFF/reloc-discarded-early.s
+++ lld/trunk/test/COFF/reloc-discarded-early.s
@@ -0,0 +1,8 @@
+# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s
+# RUN: lld-link -entry:__ImageBase -subsystem:console -debug %t.obj
+
+.section .debug_info,"dr"
+.quad .Ldrectve
+
+.section .drectve
+.Ldrectve:
Index: lld/trunk/test/COFF/reloc-discarded-early2.s
===================================================================
--- lld/trunk/test/COFF/reloc-discarded-early2.s
+++ lld/trunk/test/COFF/reloc-discarded-early2.s
@@ -0,0 +1,9 @@
+# RUN: llvm-mc -triple=x86_64-windows-msvc -filetype=obj -o %t.obj %s
+# RUN: not lld-link -entry:__ImageBase -subsystem:console %t.obj 2>&1 | FileCheck %s
+
+.text
+# CHECK: error: relocation against symbol in discarded section: .drectve
+.quad .Ldrectve
+
+.section .drectve
+.Ldrectve:
Index: lld/trunk/COFF/Chunks.cpp
===================================================================
--- lld/trunk/COFF/Chunks.cpp
+++ lld/trunk/COFF/Chunks.cpp
@@ -252,7 +252,19 @@
     // Get the output section of the symbol for this relocation.  The output
     // section is needed to compute SECREL and SECTION relocations used in debug
     // info.
-    Defined *Sym = cast<Defined>(File->getSymbol(Rel.SymbolTableIndex));
+    auto *Sym =
+        dyn_cast_or_null<Defined>(File->getSymbol(Rel.SymbolTableIndex));
+    if (!Sym) {
+      if (isCodeView() || isDWARF())
+        continue;
+      // Symbols in early discarded sections are represented using null pointers,
+      // so we need to retrieve the name from the object file.
+      COFFSymbolRef Sym =
+          check(File->getCOFFObj()->getSymbol(Rel.SymbolTableIndex));
+      StringRef Name;
+      File->getCOFFObj()->getSymbolName(Sym, Name);
+      fatal("relocation against symbol in discarded section: " + Name);
+    }
     Chunk *C = Sym->getChunk();
     OutputSection *OS = C ? C->getOutputSection() : nullptr;
 
@@ -328,7 +340,8 @@
     uint8_t Ty = getBaserelType(Rel);
     if (Ty == IMAGE_REL_BASED_ABSOLUTE)
       continue;
-    if (isa<DefinedAbsolute>(File->getSymbol(Rel.SymbolTableIndex)))
+    Symbol *Target = File->getSymbol(Rel.SymbolTableIndex);
+    if (!Target || isa<DefinedAbsolute>(Target))
       continue;
     Res->emplace_back(RVA + Rel.VirtualAddress, Ty);
   }
Index: lld/trunk/COFF/MarkLive.cpp
===================================================================
--- lld/trunk/COFF/MarkLive.cpp
+++ lld/trunk/COFF/MarkLive.cpp
@@ -63,7 +63,8 @@
 
     // Mark all symbols listed in the relocation table for this section.
     for (Symbol *B : SC->symbols())
-      AddSym(B);
+      if (B)
+        AddSym(B);
 
     // Mark associative sections if any.
     for (SectionChunk *C : SC->children())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40235.123628.patch
Type: text/x-patch
Size: 2880 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171120/24445f8c/attachment.bin>


More information about the llvm-commits mailing list