diff options
| -rw-r--r-- | lld/ELF/InputSection.cpp | 7 | ||||
| -rw-r--r-- | lld/test/ELF/invalid-undef-section-symbol.test | 27 |
2 files changed, 33 insertions, 1 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 2c628b964cd..dc55f6320b9 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -400,7 +400,12 @@ void InputSection::copyRelocations(uint8_t *Buf, ArrayRef<RelTy> 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<Defined>(Sym).Section; + auto *D = dyn_cast<Defined>(&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 00000000000..f634d6ad8c6 --- /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 |

