Index: ELF/InputFiles.cpp =================================================================== --- ELF/InputFiles.cpp +++ ELF/InputFiles.cpp @@ -367,14 +367,15 @@ 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]; // We found that GNU assembler 2.17.50 [FreeBSD] 2007-07-03 // could generate broken objects. STT_SECTION symbols can be // 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 (Index >= Sections.size() || + (!Sections[Index] && Sym.getType() != STT_SECTION)) + fatal(getFilename(this) + ": invalid section index: " + Twine(Index)); + InputSectionBase *S = Sections[Index]; if (!S || 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