diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index dda18aa8a4c4..d9630790e2c7 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -81,7 +81,7 @@ typename ELFT::SymRange ELFFileBase::getElfSymbols(bool OnlyGlobals) { Elf_Sym_Range Syms = ELFObj.symbols(Symtab); uint32_t NumSymbols = std::distance(Syms.begin(), Syms.end()); uint32_t FirstNonLocal = Symtab->sh_info; - if (FirstNonLocal > NumSymbols) + if (FirstNonLocal == 0 || FirstNonLocal > NumSymbols) fatal(getFilename(this) + ": invalid sh_info in symbol table"); if (OnlyGlobals) diff --git a/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf b/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf new file mode 100644 index 000000000000..4fea12cf2033 Binary files /dev/null and b/lld/test/ELF/invalid/Inputs/symtab-sh_info2.elf differ diff --git a/lld/test/ELF/invalid/symtab-sh-info.s b/lld/test/ELF/invalid/symtab-sh-info.s new file mode 100644 index 000000000000..727639f4910d --- /dev/null +++ b/lld/test/ELF/invalid/symtab-sh-info.s @@ -0,0 +1,4 @@ +## sh_info contains zero value. First entry in a symbol table is always completely zeroed, +## 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