diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 2c628b964cd4..dc55f6320b94 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -400,7 +400,12 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef Rels) { // avoid having to parse and recreate .eh_frame, we just replace any // relocation in it pointing to discarded sections with R_*_NONE, which // hopefully creates a frame that is ignored at runtime. - SectionBase *Section = cast(Sym).Section; + auto *D = dyn_cast(&Sym); + if (!D) { + error("STT_SECTION symbol should be defined"); + continue; + } + SectionBase *Section = D->Section; if (Section == &InputSection::Discarded) { P->setSymbolAndType(0, 0, false); continue; diff --git a/lld/test/ELF/invalid-undef-section-symbol.test b/lld/test/ELF/invalid-undef-section-symbol.test new file mode 100644 index 000000000000..f634d6ad8c63 --- /dev/null +++ b/lld/test/ELF/invalid-undef-section-symbol.test @@ -0,0 +1,27 @@ +# RUN: yaml2obj %s -o %t.o +# RUN: not ld.lld -r %t.o -o %2.o 2>&1 | FileCheck %s + +# We used to crash at this. +# CHECK: STT_SECTION symbol should be defined + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + - Name: .rela.text + Type: SHT_RELA + AddressAlign: 0x0000000000000008 + Info: .text + Relocations: + - Offset: 0x0000000000000000 + Symbol: .text + Type: R_X86_64_NONE +Symbols: + Local: + - Name: .text + Type: STT_SECTION