Index: ELF/InputSection.cpp =================================================================== --- ELF/InputSection.cpp +++ ELF/InputSection.cpp @@ -435,10 +435,14 @@ // .eh_frame is horribly special and can reference discarded sections. To // 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. + // hopefully creates a frame that is ignored at runtime. Also, don't warn + // on debug sections. auto *D = dyn_cast(&Sym); if (!D) { - warn("STT_SECTION symbol should be defined"); + if (!Sec->Name.startswith(".debug") && + !Sec->Name.startswith(".zdebug") && Sec->Name != ".eh_frame") + warn("relocation refers to a discarded section\n>>> referenced by " + + getObjMsg(P->r_offset)); P->setSymbolAndType(0, 0, false); continue; } Index: test/ELF/Inputs/comdat-discarded-reloc.s =================================================================== --- test/ELF/Inputs/comdat-discarded-reloc.s +++ test/ELF/Inputs/comdat-discarded-reloc.s @@ -1,6 +1,8 @@ -.section .text.bar1,"aG",@progbits,group,comdat +.global bar, _start -.section .text.bar2 -.global bar -bar: - .quad .text.bar1 +.section .text.foo,"aG",@progbits,group,comdat + +.section .text +_start: + .quad .text.foo + .quad bar Index: test/ELF/comdat-discarded-reloc.s =================================================================== --- test/ELF/comdat-discarded-reloc.s +++ test/ELF/comdat-discarded-reloc.s @@ -1,17 +1,36 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/comdat-discarded-reloc.s -o %t2.o -# RUN: ld.lld -gc-sections --noinhibit-exec %t.o %t2.o -o /dev/null +# RUN: ld.lld -gc-sections --noinhibit-exec %t2.o %t.o -o /dev/null +# RUN: ld.lld -r %t2.o %t.o -o %t 2>&1 | FileCheck --check-prefix=WARN %s +# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s ## ELF spec doesn't allow a relocation to point to a deduplicated ## COMDAT section. Unfortunately this happens in practice (e.g. .eh_frame) ## Test case checks we do not crash. -.global bar, _start +# WARN: warning: relocation refers to a discarded section +# WARN-NEXT: >>> referenced by {{.*}}.o:(.rela.text.bar2+0x0) +# WARN-NOT: warning -.section .text.foo,"aG",@progbits,group,comdat +# RELOC: .rela.eh_frame { +# RELOC-NEXT: R_X86_64_NONE +# RELOC-NEXT: } +# RELOC-NEXT: .rela.debug_foo { +# RELOC-NEXT: R_X86_64_NONE +# RELOC-NEXT: } -.section .text -_start: - .quad .text.foo - .quad bar +.section .text.bar1,"aG",@progbits,group,comdat + +## .text.bar2 has the SHF_ALLOC flag. Warn on its relocation to the discarded .text.bar1 +.section .text.bar2,"ax" +.globl bar +bar: + .quad .text.bar1 + +## Don't warn on .eh_frame, .debug* or .zdebug* +.section .eh_frame,"a" + .quad .text.bar1 + +.section .debug_foo + .quad .text.bar1 Index: test/ELF/invalid-undef-section-symbol.test =================================================================== --- test/ELF/invalid-undef-section-symbol.test +++ /dev/null @@ -1,26 +0,0 @@ -# RUN: yaml2obj %s -o %t.o -# RUN: not ld.lld -r --fatal-warnings %t.o -o /dev/null 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: - - Name: .text - Type: STT_SECTION