Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -377,8 +377,6 @@ InputSectionBase * elf::ObjectFile::getSection(const Elf_Sym &Sym) const { uint32_t Index = this->getSectionIndex(Sym); - if (Index == 0) - return nullptr; if (Index >= Sections.size()) fatal(getFilename(this) + ": invalid section index: " + Twine(Index)); InputSectionBase *S = Sections[Index]; @@ -387,7 +385,13 @@ // associated with SHT_REL[A]/SHT_SYMTAB/SHT_STRTAB sections. // In this case it is fine for section to be null here as we // do not allocate sections of these types. - if (!S || S == &InputSectionBase::Discarded) + if (!S) { + if (Index == 0 || Sym.getType() == STT_SECTION) + return nullptr; + fatal(getFilename(this) + ": invalid section index: " + Twine(Index)); + } + + if (S == &InputSectionBase::Discarded) return S; return S->Repl; } Index: test/ELF/invalid/invalid-elf.test =================================================================== --- test/ELF/invalid/invalid-elf.test +++ test/ELF/invalid/invalid-elf.test @@ -20,6 +20,10 @@ # RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX-LLD %s # INVALID-SECTION-INDEX-LLD: invalid section index +## section-index2.elf has local symbol with incorrect section index. +# RUN: not ld.lld %p/Inputs/section-index2.elf -o %t2 2>&1 | \ +# RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX-LLD %s + # RUN: not ld.lld %p/Inputs/shstrndx.so -o %t2 2>&1 | \ # RUN: FileCheck --check-prefix=INVALID-SECTION-INDEX %s # INVALID-SECTION-INDEX: Invalid section index