Index: lld/trunk/ELF/InputFiles.cpp =================================================================== --- lld/trunk/ELF/InputFiles.cpp +++ lld/trunk/ELF/InputFiles.cpp @@ -343,10 +343,15 @@ uint32_t Index = this->getSectionIndex(Sym); if (Index == 0) return nullptr; - if (Index >= Sections.size() || !Sections[Index]) + if (Index >= Sections.size()) fatal(getFilename(this) + ": invalid section index: " + Twine(Index)); InputSectionBase *S = Sections[Index]; - if (S == &InputSectionBase::Discarded) + // 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 (!S || S == &InputSectionBase::Discarded) return S; return S->Repl; } Index: lld/trunk/test/ELF/section-symbols.test =================================================================== --- lld/trunk/test/ELF/section-symbols.test +++ lld/trunk/test/ELF/section-symbols.test @@ -0,0 +1,35 @@ +# RUN: yaml2obj %s -o %t +# RUN: ld.lld -shared %t -o %tout + +# Verify that lld can handle STT_SECTION symbols associated +# with SHT_REL[A]/SHT_SYMTAB/SHT_STRTAB sections. + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + OSABI: ELFOSABI_FREEBSD + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000010 + Content: "00000000" + - Name: .rela.text + Type: SHT_RELA + Link: .symtab + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: +Symbols: + Local: + - Type: STT_SECTION + Section: .rela.text + - Type: STT_SECTION + Section: .shstrtab + - Type: STT_SECTION + Section: .symtab + - Type: STT_SECTION + Section: .strtab