Skip to content

Commit

Permalink
[COFF] Handle comdat sections without leader symbols
Browse files Browse the repository at this point in the history
Discard them unless they have been associated by other means (yet
uimplemented).

According to MS link.exe, such sections are illegal, but MinGW setups
use them in their take on associative comdats.

This avoids leaving references to the bogus SectionChunk* PendingComdat,
which cannot be dereferenced.

This fixes PR38183.

Differential Revision: https://reviews.llvm.org/D49653

llvm-svn: 338064
  • Loading branch information
mstorsjo committed Jul 26, 2018
1 parent 390bce4 commit 6c8cbf6
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
7 changes: 7 additions & 0 deletions lld/COFF/InputFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,13 @@ void ObjFile::initializeSymbols() {
if (auto *Def = Sym.getSectionDefinition())
if (Def->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE)
readAssociativeDefinition(Sym, Def);
if (SparseChunks[Sym.getSectionNumber()] == PendingComdat) {
StringRef Name;
COFFObj->getSymbolName(Sym, Name);
log("comdat section " + Name +
" without leader and unassociated, discarding");
continue;
}
Symbols[I] = createRegular(Sym);
}

Expand Down
21 changes: 21 additions & 0 deletions lld/test/COFF/pending-comdat.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# REQUIRES: x86

# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.obj

# RUN: not lld-link -lldmingw -out:%t.exe -entry:main -subsystem:console %t.obj 2>&1 | FileCheck %s

# CHECK: error: undefined symbol: other

# Check that the comdat section without a symbol isn't left pending once we iterate symbols
# to print source of the undefined symbol.

.text
.globl main
main:
call other
ret

.section .data$pending,"w"
.linkonce discard
.Llocal:
.byte 0

0 comments on commit 6c8cbf6

Please sign in to comment.