Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -387,6 +387,8 @@ continue; if (!includeInSymtab(*B)) continue; + if (!B->IsLocal) + fatal(getFilename(F) + ": invalid sh_info in symbol table"); StringRef SymName(StrTab + B->getNameOffset()); InputSectionBase *Sec = DR->Section; if (!shouldKeepInSymtab(Sec, SymName, *B)) Index: test/ELF/invalid-elf.test =================================================================== --- test/ELF/invalid-elf.test +++ test/ELF/invalid-elf.test @@ -8,10 +8,6 @@ # RUN: FileCheck --check-prefix=INVALID-FILE-CLASS %s # INVALID-FILE-CLASS: invalid file class: test.o -# RUN: not ld.lld %p/Inputs/invalid-symtab-sh_info.elf -o %t2 2>&1 | \ -# RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s -# INVALID-SYMTAB-SHINFO: invalid sh_info in symbol table - # RUN: not ld.lld %p/Inputs/invalid-binding.elf -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-BINDING %s # INVALID-BINDING: unexpected binding Index: test/ELF/invalid-symtab-sh-info.s =================================================================== --- test/ELF/invalid-symtab-sh-info.s +++ test/ELF/invalid-symtab-sh-info.s @@ -0,0 +1,8 @@ +# sh_info contains value greater than total amount of symbols. +# RUN: not ld.lld %p/Inputs/invalid-symtab-sh_info.elf -o %t2 2>&1 | \ +# RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s +# INVALID-SYMTAB-SHINFO: invalid sh_info in symbol table + +# sh_info contains invalid value saying non-local symbol is local. +# RUN: not ld.lld %p/Inputs/invalid-symtab-sh_info2.elf -o %t2 2>&1 | \ +# RUN: FileCheck --check-prefix=INVALID-SYMTAB-SHINFO %s