Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -364,6 +364,8 @@ for (elf::ObjectFile *F : Symtab::X->getObjectFiles()) { StringRef StrTab = F->getStringTable(); for (SymbolBody *B : F->getLocalSymbols()) { + if (!B->IsLocal) + fatal(getFilename(F) + ": invalid sh_info in symbol table"); auto *DR = dyn_cast>(B); // No reason to keep local undefined symbol in symtab. if (!DR) Index: test/ELF/invalid/symtab-sh-info.s =================================================================== --- test/ELF/invalid/symtab-sh-info.s +++ test/ELF/invalid/symtab-sh-info.s @@ -2,3 +2,8 @@ ## so sh_info should be at least 1 in a valid ELF. # RUN: not ld.lld %p/Inputs/symtab-sh_info2.elf -o %t2 2>&1 | FileCheck %s # CHECK: invalid sh_info in symbol table + +## sh_info contains invalid value saying non-local symbol is local. +# RUN: not ld.lld %p/Inputs/symtab-sh_info3.elf -o %t2 2>&1 | \ +# RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s +# INVALID-SYMTAB-SHINFO: invalid sh_info in symbol table