From: Martin Storsjo Date: Thu, 26 Jul 2018 20:14:50 +0000 (+0000) Subject: [COFF] Handle comdat sections without leader symbols X-Git-Tag: llvmorg-7.0.0-rc1~484 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6c8cbf6db0839e525db4969377fa8109b6a6fcc9;p=platform%2Fupstream%2Fllvm.git [COFF] Handle comdat sections without leader symbols 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 --- diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 2788f3b..2b3e65f 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -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); } diff --git a/lld/test/COFF/pending-comdat.s b/lld/test/COFF/pending-comdat.s new file mode 100644 index 0000000..b10dce1 --- /dev/null +++ b/lld/test/COFF/pending-comdat.s @@ -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