[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