Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -775,9 +775,18 @@ // Ignore local symbols. if (Versym && VersymIndex == VER_NDX_LOCAL) continue; - - const Elf_Verdef *V = - VersymIndex == VER_NDX_GLOBAL ? nullptr : Verdefs[VersymIndex]; + const Elf_Verdef *V = nullptr; + if (VersymIndex != VER_NDX_GLOBAL) { + if (VersymIndex >= Verdefs.size()) { + error("corrupt input file: version definition index " + + Twine(VersymIndex) + " for symbol " + Name + + " is greater than the maximum value " + + Twine(Verdefs.size() - 1) + "\n>>> symbol is defined in " + + toString(this)); + continue; + } + V = Verdefs[VersymIndex]; + } if (!Hidden) Symtab->addShared(Name, this, Sym, V); Index: lld/trunk/test/ELF/corrupted-version-reference.s =================================================================== --- lld/trunk/test/ELF/corrupted-version-reference.s +++ lld/trunk/test/ELF/corrupted-version-reference.s @@ -0,0 +1,10 @@ +# RUN: llvm-mc -triple=mips64-unknown-freebsd %s -filetype=obj -o %t.o +# RUN: not ld.lld %t.o %S/Inputs/corrupt-version-reference.so -o %t.exe 2>&1 | FileCheck %s + +# CHECK: error: corrupt input file: version definition index 9 for symbol __cxa_finalize is greater than the maximum value 8 +# CHECK: >>> symbol is defined in {{.+}}/corrupt-version-reference.so + +.globl __start +__start: + dla $a0, __cxa_finalize + nop