forked from OSchip/llvm-project
COFF: Correctly handle relocations against early discarded sections.
Don't crash if we encounter a reference to an early discarded section (such as .drectve). Instead, handle them the same way as sections discarded by comdat merging, i.e. either print an error message or (for debug sections) silently ignore the relocation. Differential Revision: https://reviews.llvm.org/D40235 llvm-svn: 318689
This commit is contained in:
parent
25219377d7
commit
31275d4472
|
@ -252,7 +252,19 @@ void SectionChunk::writeTo(uint8_t *Buf) const {
|
|||
// 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 @@ void SectionChunk::getBaserels(std::vector<Baserel> *Res) {
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -63,7 +63,8 @@ void markLive(const std::vector<Chunk *> &Chunks) {
|
|||
|
||||
// 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())
|
||||
|
|
|
@ -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:
|
|
@ -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:
|
Loading…
Reference in New Issue